是否可以静态链接共享对象?

Bri*_*erg 6 shared-libraries dynamic-linking static-linking

我的问题与这个问题不一样.

我正在开发一个带有独立二进制文件的项目,该项目没有动态/外部链接,并且在*nix环境中运行.

我正在尝试使用更新的工具集进行构建,但现在无法使用旧工具集中提供的某些静态库 - 例如,此工具集中未提供提供_start的crt库.

我一直在挖掘供应商工具集提供的文件,并从crt库中找到了我需要的符号的共享对象(例如,_start,_fini等),但我不确定是否有一种直接的方式来静态链接将对象共享为二进制文件,并进一步使该二进制文件可执行.

简短版本:非共享对象二进制文件是否可以与共享对象静态链接,而结果不会成为另一个共享对象?

Ker*_* SB 8

共享库和静态库之间存在根本区别.首先,请在此网站上搜索以前的讨论,并查看此问题(以及其中的答案).

基本上,静态库只是对象的集合,链接器将符号名称解析为固定地址 - 这是静态链接所必需的.另一方面,共享库更像是一个独立的可执行文件,它由加载器加载到内存中,并具有程序跳转到的入口点地址.但是,在链接共享库时,通常不会保留静态库具有的重定位表,因此通常无法从链接的共享库中提取可链接的对象代码.


Ian*_*ote 5

是的,我知道这是一个 6 年前的问题。有人告诉我可以静态链接到共享对象库,但我也发现它不是。

要实际证明使用ld(gcc的链接器)无法静态链接共享对象库,请使用以下gcc命令:

gcc -o executablename objectname.o -Wl,-Bstatic -l:libnamespec.so
Run Code Online (Sandbox Code Playgroud)

(当然,您必须objectname.o从编译sourcename.c,并且您可能还应该构建自己的共享对象库。如果这样做,请使用-Wl,--library-path,.ld 以便 ld 可以在本地目录中找到您的库。)

您收到的实际错误是:

/usr/bin/ld: attempted static link of dynamic object `libnamespec.so'
collect2: error: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)

显然,试图将对象从共享对象库中拉出是ld会犹豫的。

有提出了一些建议在这里,但我对这个问题的兴趣仅仅是学术。

希望有帮助。