Bug #8443

-Lprefix/lib

Added by Akira Tanaka 11 months ago. Updated about 1 month ago.

[ruby-dev:47363]
Status:Closed
Priority:Normal
Assignee:Nobuyoshi Nakada
Category:build
Target version:-
ruby -v:2.1.0 Backport:1.9.3: REJECTED, 2.0.0: REQUIRED

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/crtbegindynamic.o(.text+0x19):
error: undefined reference to '
libcinit'
evalerror.c:8: error: undefined reference to 'stackchkguard'
file.c:1023: error: undefined reference to '
stackchkguard'
file.c:1066: error: undefined reference to '
stackchk_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]

Associated revisions

Revision 40907
Added by Nobuyoshi Nakada 11 months ago

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. [Bug #8443]

History

#1 Updated by Nobuyoshi Nakada 11 months ago

  • Category set to build
  • Status changed from Open to Assigned
  • Assignee set to 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

#2 Updated by Nobuyoshi Nakada 11 months 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. [Bug #8443]

#3 Updated by Akira Tanaka 11 months 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]

#4 Updated by Akira Tanaka 11 months 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]

#5 Updated by Tomoyuki Chikanaga 7 months ago

なかださん

バックポートしようと思ったのですが LIBRUBYPATHFLAGS への代入が ruby200 では -L\$(libdir) になっていたので(r39347 がバックポートされていないため)、conflict を解消して以下のようなパッチにしてみました。
-L\$(libdir) → -L${libprefix} に変更してもいいでしょうか?

Index: configure.in

--- configure.in (revision 42911)
+++ configure.in (working copy)
@@ -2816,7 +2816,8 @@ ASCASE("$enableshared", [yes], [
])
if test "$enablerpath" = yes; then
test -z "$LIBRUBY
RPATHFLAGS" || LIBRUBYRPATHFLAGS="$LIBRUBYRPATHFLAGS "
- LIBRUBYRPATHFLAGS="$LIBRUBYRPATHFLAGS${linkerflag}-R ${linkerflag}${libprefix} -L\$(libdir)"
+ LIBRUBYRPATHFLAGS="$LIBRUBYRPATHFLAGS${linkerflag}-R ${linkerflag}${libprefix}"
+ test "x$crosscompiling" = xyes || LIBRUBYRPATHFLAGS="$LIBRUBYRPATHFLAGS -L${libprefix}"
LIBRUBYARG
SHARED="$LIBRUBYRPATHFLAGS $LIBRUBYARGSHARED"
LIBRUBYARGSTATIC="$LIBRUBYRPATHFLAGS $LIBRUBYARG_STATIC"
fi

#6 Updated by Nobuyoshi Nakada 7 months ago

r39347 のバックポート予定がないのならいいんじゃないでしょうか。

#7 Updated by Tomoyuki Chikanaga 7 months ago

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

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

Index: configure.in

--- configure.in (revision 42911)
+++ configure.in (working copy)
@@ -2816,7 +2816,8 @@ ASCASE("$enableshared", [yes], [
])
if test "$enablerpath" = yes; then
test -z "$LIBRUBY
RPATHFLAGS" || LIBRUBYRPATHFLAGS="$LIBRUBYRPATHFLAGS "
- LIBRUBYRPATHFLAGS="$LIBRUBYRPATHFLAGS${linkerflag}-R ${linkerflag}${libprefix} -L\$(libdir)"
+ LIBRUBYRPATHFLAGS="$LIBRUBYRPATHFLAGS${linkerflag}-R ${linkerflag}${libprefix}"
+ test "x$crosscompiling" = xyes || LIBRUBYRPATHFLAGS="$LIBRUBYRPATHFLAGS -\$(libdir)"
LIBRUBYARG
SHARED="$LIBRUBYRPATHFLAGS $LIBRUBYARGSHARED"
LIBRUBYARGSTATIC="$LIBRUBYRPATHFLAGS $LIBRUBYARG_STATIC"
fi

#8 Updated by Akira Tanaka 7 months 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]

#9 Updated by Tomoyuki Chikanaga 7 months 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]

#10 Updated by Usaku NAKAMURA about 1 month ago

  • Backport changed from 1.9.3: REQUIRED, 2.0.0: REQUIRED to 1.9.3: REJECTED, 2.0.0: REQUIRED

1.9.3では諦めます。

Also available in: Atom PDF