簡體   English   中英

使用G ++在Linux中進行靜態編譯

[英]Static compilation in linux using g++

我靜態地編譯了OpenSSL庫。 我想用OpenSSL庫靜態編譯MyModule 我正在使用Makefile與

LDFLAGS      = $(LD_SHARED_FLAGS) -fPIC -static -lssl -lcrypto

根Makefile中的LD_SHARED_FLAGS具有

LD_SHARED_FLAGS     = -z text

當我運行make時,我得到了,

g++ -shared -L../../lib  -z text -fPIC -static -lssl -lcrypto  -o libMyModule.so debug_utils.o  MyModule.o   labels.o -L/path_to_openssl/lib -lssl -lcrypto -lc
/usr/bin/ld: /usr/lib/gcc/x86_64-redhat-linux/4.8.5/crtbeginT.o: relocation R_X86_64_32 against `__TMC_END__' can not be used when making a shared object; recompile with -fPIC

/usr/lib/gcc/x86_64-redhat-linux/4.8.5/crtbeginT.o: error adding symbols: Bad value

collect2: error: ld returned 1 exit status

make: *** [libMyModule.so] Error 1

我是否使用正確的標志進行靜態編譯?

如何解決此錯誤?

用-fPIC重建openssl靜態庫。

看來您想將靜態庫libssl.alibcrypto.a鏈接到共享庫libMyModule.so

在鏈接命令中添加GCC選項-static不僅會產生這種效果,而且會產生更大的影響。 它的作用是請求一個完全靜態的鏈接 鏈接程序必須找到並使用所有必需庫的靜態版本:不僅是您在鏈接命令中指定的庫,還包括默認庫: libclibstdc++libgcc以及C運行時的靜態鏈接變體支持二進制文件crt*.o

可能您不想要所有-static東西,即使您不介意擁有它,它也與-shared不兼容。

當然,您需要-shared來創建共享庫。 鏈接到共享庫的所有目標文件都必須是使用-fPIC編譯的位置無關代碼。

您遇到的錯誤:

/usr/bin/ld: /usr/lib/gcc/x86_64-redhat-linux/4.8.5/crtbeginT.o: \
relocation R_X86_64_32 against `__TMC_END__' can not be used when making a shared object; \
recompile with -fPIC

告訴您, crtbeginT.o所需的C運行時二進制文件crtbeginT.o未使用-fPIC編譯; 不是位置無關的代碼,因此無法鏈接到共享庫中。

但是-static選項需要crtbeginT.o進行鏈接。 如果未指定-static ,則將鏈接crtbeginS.o ,這是此運行時二進制文件的PIC變體,用於與共享庫鏈接,並且不會發生該錯誤。

因此,請不要指定-static 它不與-shared混合使用,也不是將靜態版本的libssllibcrypto鏈接到libMyModule.so

實現這一目標的方法不止一種。 最簡單的方法是使用明確指定那些庫的靜態版本的選項替換鏈接命令中的-lssl -lcrypto ,即

-l:libssl.a -l:libcrypto.a

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM