Forum: Ruby-dev -Lprefix/lib

5cf8f058a4c094bb708174fb43e7a387?d=identicon&s=25 nagachika (Tomoyuki Chikanaga) (Guest)
on 2013-09-12 18:57
(Received via mailing list)
Issue #8443 has been updated by nagachika (Tomoyuki Chikanaga).


r39347 のバックポートははさらに他の変更も引き連れていかないといけないと思うのでしないつもりです。

では少し変更して以下で入れておこうと思います。

Index: configure.in
===================================================================
--- configure.in        (revision 42911)
+++ configure.in        (working copy)
@@ -2816,7 +2816,8 @@ AS_CASE("$enable_shared", [yes], [
 ])
 if test "$enable_rpath" = yes; then
     test -z "$LIBRUBY_RPATHFLAGS" ||
LIBRUBY_RPATHFLAGS="$LIBRUBY_RPATHFLAGS "
-    LIBRUBY_RPATHFLAGS="$LIBRUBY_RPATHFLAGS${linker_flag}-R
${linker_flag}${libprefix} -L\$(libdir)"
+    LIBRUBY_RPATHFLAGS="$LIBRUBY_RPATHFLAGS${linker_flag}-R
${linker_flag}${libprefix}"
+    test "x$cross_compiling" = xyes ||
LIBRUBY_RPATHFLAGS="$LIBRUBY_RPATHFLAGS -\$(libdir)"
     LIBRUBYARG_SHARED="$LIBRUBY_RPATHFLAGS $LIBRUBYARG_SHARED"
     LIBRUBYARG_STATIC="$LIBRUBY_RPATHFLAGS $LIBRUBYARG_STATIC"
 fi
----------------------------------------
Bug #8443:  -Lprefix/lib
https://bugs.ruby-lang.org/issues/8443#change-41778

Author: akr (Akira Tanaka)
Status: Closed
Priority: Normal
Assignee: nobu (Nobuyoshi Nakada)
Category: build
Target version:
ruby -v: 2.1.0
Backport: 1.9.3: REQUIRED, 2.0.0: REQUIRED


 最近試しているクロスコンパイルな CI で、
 思い立って DESTDIR を使って気がついたんですが、
 configure に --prefix=/usr と指定すると、
 /usr にあるライブラリを使ってしまうことがあるようです。

 クロスコンパイルなので、ビルド環境の /usr は使ってほしくないんですが、
 どうでしょうか。

 実際に問題が出た環境は buildroot で作った i386 環境と、
 Android (x86) の環境です。
 ビルド環境 (x86_64) と中途半端に似ていると問題が起きやすいようです。

 まず i386 は
 http://www.rubyist.net/~akr/chkbuild/debian/crossr...
 というように、curses のところで -ltermcap が見つからないというエラーになっています。

 compiling curses.c
 linking shared-object curses.so
 /extdisk/chkbuild/buildroot/i386/buildroot-2013.02/output/host/usr/lib/gcc/i586-buildroot-linux-uclibc/4.6.3/../../../../i586-buildroot-linux-uclibc/bin/ld:
 cannot find -ltermcap

 ext/curses/mkmf.log をみると以下のように -ltermcap は見つかっています。
 (改行を入れてあります)

 have_library: checking for tgetent() in -ltermcap...
-------------------- yes

 "i586-buildroot-linux-uclibc-gcc -o conftest
  -I../../.ext/include/i586-linux-uclibc -I../.././include
  -I../.././ext/curses
  -O3 -fno-fast-math
  -ggdb3
  -Wall -Wextra -Wno-unused-parameter -Wno-parentheses -Wno-long-long
  -Wno-missing-field-initializers -Wunused-variable -Wpointer-arith
  -Wwrite-strings -Wdeclaration-after-statement
  -Wimplicit-function-declaration
  conftest.c
  -L.  -L../..  -L.
  -rdynamic -Wl,-export-dynamic -Wl,-R -Wl,/usr/lib -L/usr/lib
  -lruby-static -ltermcap  -lpthread -ldl -lcrypt -lm   -lc"
 conftest.c: In function 't':
 conftest.c:13:57: error: 'tgetent' undeclared (first use in this
function)
 conftest.c:13:57: note: each undeclared identifier is reported only
 once for each function it appears in
 conftest.c:13:32: warning: variable 'p' set but not used
 [-Wunused-but-set-variable]
 checked program was:
 /* begin */
  1: #include "ruby.h"
  2:
  3: /*top*/
  4: extern int t(void);
  5: int main(int argc, char **argv)
  6: {
  7:   if (argc > 1000000) {
  8:     printf("%p", &t);
  9:   }
 10:
 11:   return 0;
 12: }
 13: int t(void) { void ((*volatile p)()); p = (void ((*)()))tgetent;
return 0; }
 /* end */

 それに対し、make -n で実際のコマンドを調べて実行すると、リンクできません。

 % i586-buildroot-linux-uclibc-gcc -shared \
 -o ../../.ext/i586-linux-uclibc/curses.so curses.o \
 -L. -L../.. -L.  -rdynamic -Wl,-export-dynamic \
 -lncurses -ltermcap  -lpthread -ldl -lcrypt -lm   -lc
 /extdisk/chkbuild/buildroot/i386/buildroot-2013.02/output/host/usr/lib/gcc/i586-buildroot-linux-uclibc/4.6.3/../../../../i586-buildroot-linux-uclibc/bin/ld:
 cannot find -ltermcap
 collect2: ld returned 1 exit status

 比較すると、mkmf.log には -L/usr/lib があるので
 試しに足してみるとリンクできますが、それはおそらく間違いでしょう。

 また、Android (x86) では、
 http://www.rubyist.net/~akr/chkbuild/debian/crossr...
 というように ruby のリンクのところで失敗しています。

 linking ruby
 /extdisk/chkbuild/android/x86/bin/../sysroot/usr/lib/crtbegin_dynamic.o(.text+0x19):
 error: undefined reference to '__libc_init'
 eval_error.c:8: error: undefined reference to '__stack_chk_guard'
 file.c:1023: error: undefined reference to '__stack_chk_guard'
 file.c:1066: error: undefined reference to '__stack_chk_guard'
 以下略

 make -n で調べると失敗するコマンドラインは以下のようになっています。

   i686-linux-android-gcc -O3 -fno-fast-math -ggdb3 \
     -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 \
     -ansi -std=iso9899:199409 \
     -L. -fstack-protector -rdynamic -Wl,-export-dynamic \
     -fstack-protector -pie \
     main.o \
     -Wl,-R -Wl,/usr/lib -L/usr/lib \
     -lruby-static  -ldl -lm \
     -o ruby

 この場合、-L/usr/lib を削るとリンクに成功します。

 -Lprefix/lib というのは、少なくともクロスコンパイルでは間違いだと思うんですが、
 どうですかねぇ。
 --
 [田中 哲][たなか あきら][Tanaka Akira]
B11f10c4cd9d53970e7be20caa43f940?d=identicon&s=25 Tanaka Akira (Guest)
on 2013-09-13 02:49
(Received via mailing list)
2013$BG/(B9$B7n(B13$BF|(B 1:56 nagachika (Tomoyuki Chikanaga)
<nagachika00@gmail.com>:
> Issue #8443 has been updated by nagachika (Tomoyuki Chikanaga).

> $B$G$O>/$7JQ99$7$F0J2<$GF~$l$F$*$3$&$H;W$$$^$9!#(B

$BH?BP$H$$$&$o$1$G$O$J$$$N$G$9$,!"(B
$B$3$NOC$O!"$$$m$$$m$"$k(B cross compile
$B$K4X$9$kLdBj$N$&$A$N$R$H$D$J$N$G!"(B
$B$R$H$D$@$1$I$&$K$+$7$F$b(B cross compile
$B$,@.8y$9$k$h$&$K$J$k$o$1$G$O$J$$5$$,$7$^$9!#(B
5cf8f058a4c094bb708174fb43e7a387?d=identicon&s=25 Tomoyuki Chikanaga (Guest)
on 2013-09-13 03:13
(Received via mailing list)
> $BH?BP$H$$$&$o$1$G$O$J$$$N$G$9$,!"(B
> $B$3$NOC$O!"$$$m$$$m$"$k(B cross compile $B$K4X$9$kLdBj$N$&$A$N$R$H$D$J$N$G!"(B
> $B$R$H$D$@$1$I$&$K$+$7$F$b(B cross compile
$B$,@.8y$9$k$h$&$K$J$k$o$1$G$O$J$$5$$,$7$^$9!#(B
$B$J$k$[$I!#(B
configure.in $B$NJQ99$N!"FC$K(B multiarch $B$K4X$9$k$H$3$m$O(B autoconf
$B$NMW5a%P!<%8%g%s$,(B
$B>e$,$C$?$3$H$+$i5$3Z$K%P%C%/%]!<%H$7$K$/$$$N$H!"<j85$G(B cross compile
$B$r;n$94D6-$,(B
$B$J$$$N$G$A$g$C$H%D%i$$$G$9$M!#(B

$BMWK>$,=P$F$+$i9M$($k$3$H$K$7$^$9!#(B

2013$BG/(B9$B7n(B13$BF|(B 9:49 Tanaka Akira <akr@fsij.org>:
This topic is locked and can not be replied to.