Bug #8443
closed-Lprefix/lib
Description
最近試しているクロスコンパイルな CI で、
思い立って DESTDIR を使って気がついたんですが、
configure に --prefix=/usr と指定すると、
/usr にあるライブラリを使ってしまうことがあるようです。
クロスコンパイルなので、ビルド環境の /usr は使ってほしくないんですが、
どうでしょうか。
実際に問題が出た環境は buildroot で作った i386 環境と、
Android (x86) の環境です。
ビルド環境 (x86_64) と中途半端に似ていると問題が起きやすいようです。
まず i386 は
http://www.rubyist.net/~akr/chkbuild/debian/crossruby-trunk-i386/log/20130522T080000Z.diff.html.gz
というように、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/crossruby-trunk-x86android/log/20130522T093235Z.diff.html.gz
というように 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]
Updated by nobu (Nobuyoshi Nakada) over 11 years ago
- Category set to build
- Status changed from Open to Assigned
- Assignee set to nobu (Nobuyoshi Nakada)
- Backport changed from 1.9.3: UNKNOWN, 2.0.0: UNKNOWN to 1.9.3: REQUIRED, 2.0.0: REQUIRED
- ruby -v set to 2.1.0
Updated by nobu (Nobuyoshi Nakada) over 11 years ago
- Status changed from Assigned to Closed
- % Done changed from 0 to 100
This issue was solved with changeset r40907.
Akira, thank you for reporting this issue.
Your contribution to Ruby is greatly appreciated.
May Ruby be with you.
configure.in: no runtime path to -L
- configure.in (LIBRUBY_RPATHFLAGS): do not append -L option with
runtime library directory if cross compiling, but only -R option.
runtime path makes no sense on the host system. [ruby-dev:47363]
[Bug #8443]
Updated by akr (Akira Tanaka) over 11 years ago
2013年5月24日 15:55 Tanaka Akira akr@fsij.org:
2013年5月24日 10:39 Nobuyoshi Nakada nobu@ruby-lang.org:
実際に問題が出た環境は buildroot で作った i386 環境と、
Android (x86) の環境です。
ビルド環境 (x86_64) と中途半端に似ていると問題が起きやすいようです。そのrbconfig.rbを見せてもらえますか。
添付します。以下のふたつです。
おっと、r40907 で対処済みでしたか。
試します。
[田中 哲][たなか あきら][Tanaka Akira]
Updated by akr (Akira Tanaka) over 11 years ago
2013年5月24日 16:06 Tanaka Akira akr@fsij.org:
おっと、r40907 で対処済みでしたか。
試します。
ちゃんと直ってました。ありがとうございます。
http://www.rubyist.net/~akr/chkbuild/debian/crossruby-trunk-i386/log/20130524T200310Z.diff.html.gz
http://www.rubyist.net/~akr/chkbuild/debian/crossruby-trunk-x86android/log/20130524T213910Z.diff.html.gz
[田中 哲][たなか あきら][Tanaka Akira]
Updated by nagachika (Tomoyuki Chikanaga) over 11 years ago
なかださん
バックポートしようと思ったのですが LIBRUBY_PATHFLAGS への代入が ruby_2_0_0 では -L$(libdir) になっていたので(r39347 がバックポートされていないため)、conflict を解消して以下のようなパッチにしてみました。
-L$(libdir) → -L${libprefix} に変更してもいいでしょうか?
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 -L${libprefix}"
LIBRUBYARG_SHARED="$LIBRUBY_RPATHFLAGS $LIBRUBYARG_SHARED"
LIBRUBYARG_STATIC="$LIBRUBY_RPATHFLAGS $LIBRUBYARG_STATIC"
fi
Updated by nobu (Nobuyoshi Nakada) over 11 years ago
r39347 のバックポート予定がないのならいいんじゃないでしょうか。
Updated by nagachika (Tomoyuki Chikanaga) over 11 years ago
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
Updated by akr (Akira Tanaka) over 11 years ago
2013年9月13日 1:56 nagachika (Tomoyuki Chikanaga) nagachika00@gmail.com:
Issue #8443 has been updated by nagachika (Tomoyuki Chikanaga).
では少し変更して以下で入れておこうと思います。
反対というわけではないのですが、
この話は、いろいろある cross compile に関する問題のうちのひとつなので、
ひとつだけどうにかしても cross compile が成功するようになるわけではない気がします。
[田中 哲][たなか あきら][Tanaka Akira]
Updated by nagachika (Tomoyuki Chikanaga) over 11 years ago
反対というわけではないのですが、
この話は、いろいろある cross compile に関する問題のうちのひとつなので、
ひとつだけどうにかしても cross compile が成功するようになるわけではない気がします。
なるほど。
configure.in の変更の、特に multiarch に関するところは autoconf の要求バージョンが
上がったことから気楽にバックポートしにくいのと、手元で cross compile を試す環境が
ないのでちょっとツラいですね。
要望が出てから考えることにします。
2013年9月13日 9:49 Tanaka Akira akr@fsij.org:
2013年9月13日 1:56 nagachika (Tomoyuki Chikanaga) nagachika00@gmail.com:
Issue #8443 has been updated by nagachika (Tomoyuki Chikanaga).
では少し変更して以下で入れておこうと思います。
反対というわけではないのですが、
この話は、いろいろある cross compile に関する問題のうちのひとつなので、
ひとつだけどうにかしても cross compile が成功するようになるわけではない気がします。[田中 哲][たなか あきら][Tanaka Akira]
Updated by usa (Usaku NAKAMURA) almost 11 years ago
- Backport changed from 1.9.3: REQUIRED, 2.0.0: REQUIRED to 1.9.3: REJECTED, 2.0.0: REQUIRED
1.9.3では諦めます。