2006年12月12日 20:02 by BAK
ただいまuClibcを使ってソフトウェアをコンパイルしようとしているのですが、uClibcを

#>make menuconfig
#>make
#>make prefix="/usr/src/hoge" install

とインストールし使おうとしているのですが、どのように使用したら良いのか分からなく困っています。

本には export PATH=/usr/src/hoge/uclibc/bin:${PATH}
と環境変数をセットし
make CROSS_COMPAILE=i386-uclibc-
でコンパイルすると書いてあるのですが、環境変数の/usr/src/hoge/uclibc/binは存在しないパスです。

なにか分かりましたらよろしくお願いします。

レス

1: 口コミさん
uClibcを作るためのバイナリユーティリティやら、
gccとかのcコンパイラはありますか??
ない場合は、作らなければいけませんよー。
1から作る場合は、カーネルのライブラリも必要だし・・・

2006-12-27 16:25

2: 口コミさん
コナンさん>

gcc等コンパイラ類は揃っています。
現在のところライブラリは作成されているのですが、コンパイルユーティリティが作成されていません。
0.9.28だとライブラリのみ作成可能でそれ以前のバージョンだとコンパイルエラーが出てしまいます。

2006-12-27 20:09

3: 口コミさん
にわかlinux使いなので、無知なところもあるのですが、
コンパイルユーティリティって具体的に何が作成されるのですか?
(って逆に質問してしまった^^;

話が前後してるのかもしれませんが、
PATHは、uClibc用にgccとかを作った場合はそこのディレクトリを指定。
CROSS_COMPAILEは、例えばuClibc用にi386-uclibc-gccやi386-uclibc-arなどを作った場合に、
CROSS_COMPAILE=i385-uclibc-
と設定なのですが。
設定しない場合はただのgccとかが使われたはず。

あと、アーキテクチャは何を想定してるのでしょう?
(i386でいいのですかね?

uClibcのインストールでややこしいことはないと思うので、
いろいろやれば、すぐ解決できるはずですので。

2006-12-27 22:14

4: 口コミさん
コナンさん>

コンパイルユーティリティと表したのはi386-uclibc-gccやi386-uclibc-aのことです。

バージョン0.9.28だとライブラリのみでそれ以前のバージョンだとコンパイルエラーが出るというのが気になります。

2006-12-28 21:04

5: 口コミさん
年を越してしまいましたが。
状況は、いかがでしょう?
そもそも、uClibcはライブラリしか作成出来ないのでは?^^;

クロス開発環境としてuClibcをインストールしたことがあるのですが、
その時にやった手順として
バイナリユーティリティ(ar・as・ldなど)のインストール

uClibcをインストールするためのgccのインストール

上でインストールしたものを使って、uClibcをインストール

uClibcを使ったgccのインストール

のような感じでやりました。参考になるでしょうか?

>バージョン0.9.28だとライブラリのみでそれ以前のバージョンだとコンパイルエラー

見てわかるかどうかは、わかりませんが、コンパイルエラーの内容を載せてくれると何かしら言えるかもしれません。
(エラーの内容が長いかもしれませんが^^;

2007-01-05 11:00

6: 口コミさん
ちょっと分からないのですが、ターゲットはなんでしょうか?
たとえば、
(1)Bering-uClibc(http://leaf.sourceforge.net/bering-uclibc/)のように、なんらかの目的で単にGlibcをuClibcで置き換えるだけなのか、
(2)それとも、ホスト環境(たぶんx86でしょうね?)と違うターゲット(ARMやH8)で動かすことを考えているのでしょうか?

(1)の場合はそんなに問題ないでしょう(元のGlibcを壊さないように!?)
(2)の場合は、クロス開発のためのコンパイラ(リンケージエディタ(ld)等も)が必要です。またこれをソースからBuildするには、セルフ開発(たぶんx86)用のコンパイラも必要です。

また(2) の場合は、使用するボードによって、同じCPUでもIO-Portのアドレスが違うのでmake時に指定する必要がありますが、大抵の市販のボードなら、make menuconfigで選択が可能だと思います。
このへんは、ターゲットボードのクロス開発のサイトが参考になるでしょう(ARMならatmarkit、H8なら佐藤さんのサイト---資料があちこちに分散しているので大変です。他は経験がありません)。

一度このへん(上のコナンさんの手順も参考にして)を整理して頂いて、どこで問題が発生しているかを明らかにしていただけないでしょうか?

気がついたこと
CROSS_COMPAILE=i386-uclibc-
のtypoが原因(CROSS_COMPAILE--> COMPILE)ということはないでしょうね? これを見るとセルフ開発?
それと
export PATH=/usr/src/hoge/uclibc/bin:${PATH}
の「hoge」は普通アーキテクチャ名(H8など)を入れるのですが、何にしているでしょうか?(名前はなんでも良いのですが、この名前に対応させて、環境変数などを変えるので、指定の名前にしておいた方が無難です。)

2007-01-05 12:48

7: 口コミさん
コナンさん>
状況はかわらずです・・・(^^;

uClibcですが、0.9.20ですとツールチェーンもコンパイルされることを確認しました。

log:
make -C libc/sysdeps/linux/i386 headers
make[1]: Entering directory
`/usr/src/build-tools/source/uClibc-0.9.20/libc/sysdeps/linux/i386'
make[1]: Nothing to be done for `headers'.
make[1]: Leaving directory
`/usr/src/build-tools/source/uClibc-0.9.20/libc/sysdeps/linux/i386'
make -C extra
make[1]: Entering directory
`/usr/src/build-tools/source/uClibc-0.9.20/extra'
make -C gcc-uClibc
make[2]: Entering directory
`/usr/src/build-tools/source/uClibc-0.9.20/extra/gcc-uClibc'
gcc -O2 -Wall -Wl,-s gcc-uClibc.c -o i386-uclibc-gcc
chmod a+x i386-uclibc-ld

エラーの内容ですが下記になります。

gcc -Wall -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing
-mpreferred-stack-boundary=2 -falign-jumps=0 -falign-loops=0 -Os
-march=i486 -fno-builtin -nostdinc -D_LIBC -I../../include -I.
-I/usr/lib/gcc/i386-redhat-linux/4.1.1/include -DNDEBUG -fPIC
-DUCLIBC_TARGET_PREFIX=\"/\" -DUCLIBC_DEVEL_PREFIX=
\""/usr/i386-linux-uclibc"\" -DUCLIBC_BUILD_DIR=
\"/usr/src/build-tools/source/uClibc-0.9.20\" -I. -I./i386 -I../libdl -c
ldso.c -o ldso.o
ldso.c:132: error: static declaration of '_dl_not_lazy' follows
non-static declaration
ld_hash.h:125: error: previous declaration of '_dl_not_lazy' was here
ldso.c: In function '_dl_boot':
ldso.c:374: warning: pointer targets in assignment differ in signedness
ldso.c:376: warning: pointer targets in assignment differ in signedness
ldso.c:382: warning: pointer targets in assignment differ in signedness
ldso.c:608: warning: pointer targets in assignment differ in signedness
ldso.c:609: warning: pointer targets in assignment differ in signedness
make[2]: *** [ldso.o] Error 1
make[2]: Leaving directory
`/usr/src/build-tools/source/uClibc-0.9.20/ldso/ldso'
make[1]: *** [all] Error 2
make[1]: Leaving directory `/usr/src/build-tools/source/uClibc-0.9.20/ldso'
make: *** [_dir_ldso] エラー 2

nobuさん>
ターゲットはi386です。
早くi386を卒業してARMに移行したいです・・・(^^;

また、Linux環境が停電により起動しなくなってしまったので整理し、報告するのが遅れますのでよろしくお願いします(汗

2007-01-07 17:42

8: 口コミさん
uClibcのバージョン0.9.27で(インストールしたのがこのバージョンなので)
uClibc-0.9.27\ldso\ldso\ldso.c
の中身を確認したところ、"dl_not_lazy"が見つからなかったので、

ちょっと探してみたところ、

http://www.busybox.net/lists/uclibc-cvs/2003-August/003434.html

このページにいきつきまして、どうやらパッチがころがってそうですね^^
このエラーに関してはですが。


あと、nobuさんご指摘のtypoについて。
uClibcの0.9.27の場合になってしまいますが、
uClibc-0.9.27ディレクトリ直下にある、Rules.makファイルの
一部抜粋

#--------------------------------------------------------
# If you are running a cross compiler, you will want to set 'CROSS'
# to something more interesting... Target architecture is determined
# by asking the CC compiler what arch it compiles things for, so unless
# your compiler is broken, you should not need to specify TARGET_ARCH
#
# Most people will set this stuff on the command line, i.e.
# make CROSS=arm-linux-
# will build uClibc for 'arm'.

ifndef CROSS
CROSS=
endif
CC= $(CROSS)gcc
AR= $(CROSS)ar
LD= $(CROSS)ld
NM= $(CROSS)nm
STRIPTOOL= $(CROSS)strip

となっているので、バージョンによる変更なのかもしれませんが
確認しておいたほうがよろしいかと思います。
(自分も上でCROSS_COMPILE=と言ってますね。。。
正しくはCROSS=か・・・気づきませんでした。

それとですね、いまさらながら使用したいuClibcのバージョンや、
コンパイルするためのgccやらのバージョンを教えていただけませんかね?

2007-01-07 19:51

9: BAK
7: ponjoe さん

忘れたころのレスでアレなのだけど…

エラーメッセージをよく読むと

 ldso.c:132: error: static declaration of '_dl_not_lazy' follows non-static declaration
 ld_hash.h:125: error: previous declaration of '_dl_not_lazy' was here

とあります.エラーメッセージがおっしゃるには

 ldso.c では _dl_not_lazy という変数が static 宣言されているのだが
 ld_hash.h の中では非 static 宣言している

ということですね.

ld_hash.h の中を見ると,

 extern char * _dl_not_lazy;

という宣言かあり,ldso.c の中では

 static char *_dl_not_lazy = 0;

とあります.
確かにエラーメッセージのおっしゃる通りです.

ということは,この _dl_not_lazy 変数の型をどちらかに統一してやればいいことになります.
ldso.c 以外の他の .c ファイルでも参照していれば extern でなければなりませんし,他からの参照が無ければ static で構いません.

というわけで,uClibc-0.9.20/ ディレクトリの下で

 $ find . -type f | xargs grep _dl_not_lazy
 ./ldso/ldso/ld_hash.h:extern char * _dl_not_lazy;
 ./ldso/ldso/ldso.c:static char *_dl_not_lazy = 0;
 ./ldso/ldso/ldso.c: _dl_not_lazy = _dl_getenv("LD_BIND_NOW", envp);
 ./ldso/ldso/ldso.c: if (!_dl_not_lazy || *_dl_not_lazy == 0)

と実行してみると,このシンボルが使われているのは ld_hash.h と ldso.c のみということがわかります.

というわけで,ld_hash.h の中の extern 宣言の行をコメントアウトしてやると,件の箇所のコンパイルは無事通過します.

でわでわ

2007-05-19 05:40

サイト内検索