Bug #5676
closedminiruby linking error: undefined reference to ___stack_chk_guard
Description
I get what I think is a linking error when linking miniruby.
Below is a (shortened) copy of the output I get. This is on
a clean checkout of trunk (using Ruby 1.8.7 as baseruby).
duerst@jougashima /cygdrive/c/Data/ruby-public
$ make
CC = gcc
LD = ld
LDSHARED = gcc -shared -s
CFLAGS = -O3 -g -Wall -Wextra -Wno-unused-parameter -Wno-parentheses -Wno-long-long -Wno-missing-field-initializers -Wunused-variable -Werror=pointer-arith -Werror=write-strings -Werror=declaration-after-statement -Werror=implicit-function-declaration
XCFLAGS = -include ruby/config.h -include ruby/missing.h -D_FORTIFY_SOURCE=2 -fstack-protector -DRUBY_EXPORT
CPPFLAGS = -I. -I.ext/include/i386-cygwin -I./include -I.
DLDFLAGS = -Wl,--enable-auto-image-base,--enable-auto-import -Wl,--out-implib=libruby191.dll.a cygruby191.def -Xlinker --no-undefined
SOLIBS = cygruby191.res.o -lpthread -lrt -ldl -lcrypt
linking miniruby.exe
dmyencoding.o: In function set_encoding_const': /cygdrive/c/Data/ruby-public/encoding.c:1473: undefined reference to
___stack_chk_guard'
/cygdrive/c/Data/ruby-public/encoding.c:1520: undefined reference to ___stack_chk_guard' /cygdrive/c/Data/ruby-public/encoding.c:1520: undefined reference to
___stack_chk_fail'
bignum.o: In function rb_str_to_inum': /cygdrive/c/Data/ruby-public/bignum.c:763: undefined reference to
___stack_chk_guard'
/cygdrive/c/Data/ruby-public/bignum.c:790: undefined reference to ___stack_chk_guard' /cygdrive/c/Data/ruby-public/bignum.c:790: undefined reference to
___stack_chk_fail'
dir.o: In function dir_read': /cygdrive/c/Data/ruby-public/dir.c:569: undefined reference to
___stack_chk_guard'
/cygdrive/c/Data/ruby-public/dir.c:586: undefined reference to ___stack_chk_guard' /cygdrive/c/Data/ruby-public/dir.c:586: undefined reference to
___stack_chk_fail'
[... many more like these ...]
vm_dump.o: In function control_frame_dump': /cygdrive/c/Data/ruby-public/vm_dump.c:27: undefined reference to
___stack_chk_guard'
/cygdrive/c/Data/ruby-public/vm_dump.c:148: undefined reference to ___stack_chk_guard' /cygdrive/c/Data/ruby-public/vm_dump.c:148: undefined reference to
___stack_chk_fail'
cont.o: In function cont_restore_0': /cygdrive/c/Data/ruby-public/cont.c:733: undefined reference to
___stack_chk_guard'
unicode.o: In function onigenc_unicode_property_name_to_ctype': /cygdrive/c/Data/ruby-public/./enc/unicode.c:2087: undefined reference to
___stack_chk_guard'
/cygdrive/c/Data/ruby-public/./enc/unicode.c:2114: undefined reference to ___stack_chk_guard' /cygdrive/c/Data/ruby-public/./enc/unicode.c:2114: undefined reference to
___stack_chk_fail'
collect2: ld returned 1 exit status
make: *** [miniruby.exe] Error 1
duerst@jougashima /cygdrive/c/Data/ruby-public
$
Updated by kosaki (Motohiro KOSAKI) almost 13 years ago
- ruby -v changed from ruby 1.8.7 (2008-08-11 patchlevel 72) [i386-cygwin] to -
I get what I think is a linking error when linking miniruby.
Below is a (shortened) copy of the output I get. This is on
a clean checkout of trunk (using Ruby 1.8.7 as baseruby).duerst@jougashima /cygdrive/c/Data/ruby-public
$ make
    CC
Updated by nobu (Nobuyoshi Nakada) almost 13 years ago
- Category set to build
- Status changed from Open to Assigned
- Assignee set to kosaki (Motohiro KOSAKI)
- Target version set to 2.0.0
- ruby -v changed from - to ruby 2.0.0dev (2011-11-27 trunk 33861) [i386-cygwin]
It works fine.
Updated by nobu (Nobuyoshi Nakada) almost 13 years ago
The issue occurs on mingw too, and is solved by the patch.
But miniruby.exe still can't execute.
miniruby.exe: error while loading shared libraries: libssp-0.dll: cannot open shared object file: No such file or directory
I think -fstack-protector is too problematic and not worth on mingw.
Updated by kosaki (Motohiro KOSAKI) almost 13 years ago
- Status changed from Assigned to Closed
r33863
Updated by jonforums (Jon Forums) over 12 years ago
I've recently adopted FreeBSD 9.0 (in my "A New Year, A New OS" resolution) and have apparently run into this problem on trunk when trying to build with the non-default gcc-4.6.2 package. The issue goes away when I remove -fstack-protector from XCFLAGS.
As I'm new to FreeBSD so this may simply be my misconfiguration, but has anyone successfully built trunk with the gcc-4.6.2 package?
BTW, why isn't TRY_LD_FLAGS
also used in https://github.com/ruby/ruby/blob/trunk/configure.in#L506-508 (I tried it but it doesn't solve the failure)
== BUILD FAILURE ===
pkg_info | grep gcc
gcc-4.6.2 GNU Compiler Collection 4.6
git log -3 --oneline
e0f059a * 2012-02-18
ace4630 * lib/fileutils.rb: refactored FileUtil methods to use the `define_command` API...
92e7c2d * ext/dbm/extconf.rb: remove dbm.
gcc46 --version
gcc46 (FreeBSD Ports Collection) 4.6.2
../configure --enable-shared --disable-install-doc --with-gcc=gcc46
...
make
...
linking miniruby
dmyencoding.o: In function `set_encoding_const':
/home/jon/rubydev/ruby-git/build/../encoding.c:1525: undefined reference to `__stack_chk_fail_local'
bignum.o: In function `rb_str_to_inum':
/home/jon/rubydev/ruby-git/build/../bignum.c:790: undefined reference to `__stack_chk_fail_local'
dir.o: In function `dir_read':
/home/jon/rubydev/ruby-git/build/../dir.c:586: undefined reference to `__stack_chk_fail_local'
dir.o: In function `dir_each':
/home/jon/rubydev/ruby-git/build/../dir.c:623: undefined reference to `__stack_chk_fail_local'
dir.o: In function `glob_helper':
/home/jon/rubydev/ruby-git/build/../dir.c:1475: undefined reference to `__stack_chk_fail_local'
io.o:/home/jon/rubydev/ruby-git/build/../io.c:9639: more undefined references to `__stack_chk_fail_local' follow
/usr/local/bin/ld: miniruby: hidden symbol `__stack_chk_fail_local' isn't defined
/usr/local/bin/ld: final link failed: Bad value
collect2: ld returned 1 exit status
*** Error code 1
Updated by nobu (Nobuyoshi Nakada) over 12 years ago
- Status changed from Closed to Feedback
The symbol in question differs, so sounds like a runtime library mismatch.
Does it fail with the default package?
If it occurs only with the non-default, and also simplified code without ruby, it should be reported to the gcc team.
Updated by naruse (Yui NARUSE) over 12 years ago
FYI, I could build ruby on FreeBSD 9.0 amd64 with gcc 4.6 in ports.
Updated by jonforums (Jon Forums) over 12 years ago
Thanks for checking. Trunk builds fine using the old default gcc 4.2.1 and configure adds -fstack-protector
to Makefile.
I think you're right on runtime library mismatch, but shouldn't it fail when miniruby is used later in the build process, not at miniruby link time? The following sequence definitely looks like a library mismatch...
ldconfig -rv | grep gcc
search directories: /lib:/usr/lib:/usr/lib/compat:/usr/local/lib:/usr/local/lib/compat/pkg:/usr/local/lib/gcc46:/usr/local/lib/nss:/usr/local/lib/pth:/usr/local/lib/qt4:/usr/local/lib/zsh
33:-lgcc_s.1 => /lib/libgcc_s.so.1
...
475:-lssp.0 => /usr/local/lib/gcc46/libssp.so.0
ldconfig -rv | grep ssp
35:-lssp.0 => /lib/libssp.so.0
475:-lssp.0 => /usr/local/lib/gcc46/libssp.so.0
diff -q /lib/libssp.so.0 /usr/local/lib/gcc46/libssp.so.0
Files /lib/libssp.so.0 and /usr/local/lib/gcc46/libssp.so.0 differ
stat -f '%z' /lib/libssp.so.0 /usr/local/lib/gcc46/libssp.so.0
6828
26880
objdump -tT /usr/local/lib/gcc46/libssp.so.0 | grep __stack_chk_fail
00000ba0 l F .text 00000019 __stack_chk_fail_local
00000b40 g F .text 00000028 __stack_chk_fail
00000b40 g DF .text 00000028 LIBSSP_1.0 __stack_chk_fail
objdump -tT /lib/libssp.so.0 | grep __stack_chk_fail
00000fc0 g DF .text 00000027 LIBSSP_1.0 __stack_chk_fail
But shouldn't gcc46's default search dirs save the link like it appears to be happening when configure (using --with-gcc=gcc46
) executes RUBY_TRY_CFLAGS(-fstack-protector, ...)
?
gcc46 -print-search-dirs
install: /usr/local/lib/gcc46/gcc/i386-portbld-freebsd9.0/4.6.2/
programs: =/usr/local/libexec/gcc46/gcc/i386-portbld-freebsd9.0/4.6.2/:/usr/local/libexec/gcc46/gcc/i386-portbld-freebsd9.0/4.6.2/:/usr/local/libexec/gcc46/gcc/i386-portbld-freebsd9.0/:/usr/local/lib/gcc46/gcc/i386-portbld-freebsd9.0/4.6.2/:/usr/local/lib/gcc46/gcc/i386-portbld-freebsd9.0/:/usr/local/lib/gcc46/gcc/i386-portbld-freebsd9.0/4.6.2/../../../../../i386-portbld-freebsd9.0/bin/i386-portbld-freebsd9.0/4.6.2/:/usr/local/lib/gcc46/gcc/i386-portbld-freebsd9.0/4.6.2/../../../../../i386-portbld-freebsd9.0/bin/
libraries: =/usr/local/lib/gcc46/gcc/i386-portbld-freebsd9.0/4.6.2/:/usr/local/lib/gcc46/gcc/i386-portbld-freebsd9.0/4.6.2/../../../../../i386-portbld-freebsd9.0/lib/i386-portbld-freebsd9.0/4.6.2/:/usr/local/lib/gcc46/gcc/i386-portbld-freebsd9.0/4.6.2/../../../../../i386-portbld-freebsd9.0/lib/:/usr/local/lib/gcc46/gcc/i386-portbld-freebsd9.0/4.6.2/../../../i386-portbld-freebsd9.0/4.6.2/:/usr/local/lib/gcc46/gcc/i386-portbld-freebsd9.0/4.6.2/../../../:/lib/i386-portbld-freebsd9.0/4.6.2/:/lib/:/usr/lib/i386-portbld-freebsd9.0/4.6.2/:/usr/lib/
I've overlooked something important or a FreeBSD post-install step after running sudo pkg_add -r gcc-4.6.2
. Back to the RTFM-a-thon unless you guys spot my mistake.
Updated by nobu (Nobuyoshi Nakada) over 12 years ago
- Status changed from Feedback to Closed
Jon Forums wrote:
I think you're right on runtime library mismatch, but shouldn't it fail when miniruby is used later in the build process, not at miniruby link time?
The mismatch between the compiler and the runtime library. It can't be deferred.
475:-lssp.0 => /usr/local/lib/gcc46/libssp.so.0
Then -fstack-protector
should let gcc link that library.
Try "gcc46 -dumpspecs | grep -A1 '^\*link_ssp:'
", and if %{fstack-protector:}
does not exist or no options is given after the colon, the spec is wrong. And you will see same error with the following simple code and -fstack-protector
option, I guess:
#include <stdlib.h>
#include <stdio.h>
int main() {printf("%p\n", alloca(102400)); return 0;}
If it's the case, this is primarily an issue of FreeBSD port.
But shouldn't gcc46's default search dirs save the link like it appears to be happening when configure (using
--with-gcc=gcc46
) executesRUBY_TRY_CFLAGS(-fstack-protector, ...)
?
It shouild be done in the spec file, as metioned above.