[英]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.a
和libcrypto.a
鏈接到共享庫libMyModule.so
。
在鏈接命令中添加GCC選項-static
不僅會產生這種效果,而且會產生更大的影響。 它的作用是請求一個完全靜態的鏈接 。 鏈接程序必須找到並使用所有必需庫的靜態版本:不僅是您在鏈接命令中指定的庫,還包括默認庫: libc
, libstdc++
, 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
混合使用,也不是將靜態版本的libssl
和libcrypto
鏈接到libMyModule.so
。
實現這一目標的方法不止一種。 最簡單的方法是使用明確指定那些庫的靜態版本的選項替換鏈接命令中的-lssl -lcrypto
,即
-l:libssl.a -l:libcrypto.a
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.