4

libgccを静的にリンクされた.soにリンクするのに問題があります

64ビットモジュールをリンクするときにのみ発生します-m64

Ubuntu 64 ビット 12.10 gcc 4.7

Ubuntu 64bit 12.04 gcc 4.6 でも失敗しました

32bitなら問題ない

$gcc -fPIC -c -o hello.o hello.c -m32
$gcc -shared -m32 hello.o -o libhello.so -static-libgcc -Wl,-Bstatic  -lc
$ ldd libhello.so 
    statically linked

64 ビットに失敗しました

$ make
gcc -fPIC -c -o hello.o hello.c
gcc -shared -m64 hello.o -o libhello.so -static-libgcc -Wl,-Bstatic  -lc
/usr/bin/ld: /usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/libc.a(iofclose.o): relocation R_X86_64_32 against `__gcc_personality_v0' can not be used when making a shared object; recompile with -fPIC
/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/libc.a: could not read symbols: Bad value
collect2: error: ld returned 1 exit status
make: *** [libhello.so] Error 1

こんにちはC

#include <stdio.h>

int f(){

FILE *out = fopen("/tmp/x.log", "wb");
fclose(out);

return 1;
}

Makefile

all: libhello.so

libhello.so: hello.o
    gcc -shared -m64 hello.o -o libhello.so -static-libgcc -Wl,-Bstatic  -lc

hello.o: hello.c
    gcc -fPIC -c -o hello.o hello.c

clean: 
    rm -f hello.o libhello.so
4

1 に答える 1

2

答えは基本的に「それはできない」です。非PICコードを共有ライブラリにリンクしようとしていますが、これはx86_64(amd64)アーキテクチャでは不可能です。静的ですがPICバージョンのlibgccが必要になりますが、それは問題の始まりにすぎないと思います。

libgccが通常共有される理由の1つは、実行中の実行可能ファイルには、libgccが維持するいくつかの主要なデータ構造のコピーが1つだけ必要であるためです。静的リンクは最終的な実行可能ファイルにとって意味があります。これは、実行可能ファイルに静的にリンクされているのは1つのコピーだけであるためですが、動的オブジェクトのポイント全体が別の実行可能ファイルにロードされます(実行可能ファイルには独自のコピーがあります)。 libgccの、共有または静的のいずれか)。

于 2013-03-17T05:03:00.210 に答える