2012-09-13 13 views
5

プロジェクトでは、私の同僚はアプリケーションとリンクしている静的ライブラリ(liba.aなど)を作成します。arm-linuxで共有ライブラリにlibc.aをリンクするにはどうすればいいですか?arm-none-linux-gnueabi-gcc

liba.aでは、libc malloc()を所有者のバージョンに上書きします。

私は共有ライブラリlibs.soを作成し、これもappとリンクしています。

問題は私のlibs.soがアプリケーションにリンクしていて、libs.soで使用されているmalloc()がliba.aのlibmm.aにあり、 がlibc.soの標準ライブラリではありません。

次に、libc.aをlibs.soに静的リンクしたい、gccに-static -shared -fPICフラグを使用しました。

でも、私はいつもarm-2012.03/bin /../ lib/gcc/arm-none-linux-gnueabi/4.6.3 /../../../../ arm-none-linux libc/usr/lib/libc.a(dl-tsd.o)(。テキスト+ 0x14):R_ARM_TLS_LE32再配置されません。-gnueabi/bin/ld:arm-2012.03/bin /../ arm-none-linux-gnueabi /共有オブジェクトで許可されています。

誰もそれについて考えていますか?

ありがとうございます。

+0

私は静的な共有を混在させないでください.... – Jeyaram

+0

次のテキストはcodesurgeryからld.pdfからコピーされます: "-static共有ライブラリとリンクしません。これはプラットフォーム上でのみ意味があります ライブラリはサポートされています**この オプションは '-shared' **と一緒に使用できます。共有ライブラリは が作成されていますが、ライブラリの外部参照のすべてを解決する必要があります 静的ライブラリ" –

+0

@DavidChyi:-staticと-sharedの両方が混在することができますが、それは良い考えではありません。一般的に、コンパイラには多くのオプションがあり、通常のアプリケーションには使用できません。カーネル、ブートローダ、マイクロコントローラのコードなどのコンパイルのような特別な場合に重要です。 –

答えて

2

共有ライブラリに含まれるコードは-fPICでコンパイルされ、静的ライブラリのコードはコンパイルされていないため、できません。もしあなたがそれをしてしまえば、結果として得られる実行可能ファイルはlibcに複数回リンクされてしまいます。とにかく壊れやすく、遅かれ早かれクラッシュするかもしれないので、とにかく実行すべきではありません。したがって:

を実行しないでください。動的ライブラリはシステムライブラリと動的にリンクする必要があり、動的ライブラリとリンクする実行可能ファイルはシステムライブラリを動的にリンクする必要があります。

LGPLは動的リンクコードを除いているので、GNU libcを非GPLアプリケーションと静的にリンクすることは不正です。これは、ソースが利用できない可能性のある実行可能ファイルを再コンパイルすることなく、ライブラリをバグ修正することを可能にするためです。 Linuxでは、依存する実行可能ファイルを再コンパイルせずに共有ライブラリをバグ修正版にアップグレードするのはむしろ一般的です。 libcの開発者はそれを行う方法を知っています。

+0

@Hudec:親切に思い出させてくれてありがとう。私の同僚は既にlibc.soの標準malloc()を使用するようにライブラリを変更しました。しかし興味深いのは、なぜ次の例がPCのgccで動作したのですが、ARMのgccで失敗したのです:$ cat libtest.c '#include void foo(){printf("%d \ n "、42); } ' $ cat main。c '#include extern void foo(); int main(){puts( "答えは:"); foo(); } ' ' gcc -shared -fPIC libtest.c -o libtest.so -static-libgcc -Wl、-Bstatic -lc && gcc -c main.c -o main.o && gcc main.o -o test。 /libtest.so && LD_PRELOAD =。/ libtest.so。/ test' ====> 42、働いた。 –

+0

@Hudec:この情報はどこにありますか? _Don't。動的ライブラリはシステムライブラリと動的にリンクする必要があり、動的ライブラリとリンクする実行可能ファイルもシステムライブラリを動的にリンクする必要があります._ libc.aは何のために使用されていますか? –

+0

@DavidChyi:それはあなたが実際にそれを試している特定のシステム上のlibc.aが何を含んでいるかによって異なります。 1つの特定のインストールでは動作し、別のインストールでは動作しない可能性があります。多くのインストールでは、静的なlibcがインストールされていません。 –

関連する問題