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

时间:2011-04-19 17:20:53

标签: shared-libraries dynamic-linking static-linking

我的问题与this question不一样。

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

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

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

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

2 个答案:

答案 0 :(得分:8)

共享库和静态库之间存在根本区别。首先,请搜索此网站以进行先前的讨论,并check out this question(以及其中的答案)。

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

答案 1 :(得分:3)

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

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

gcc -o executablename objectname.o -Wl,-Bstatic -l:libnamespec.so

(当然你必须从objectname.o编译sourcename.c,你也应该组建自己的共享对象库。如果你这样做,请使用{{1所以ld可以在本地目录中找到你的库。)

您收到的实际错误是:

-Wl,--library-path,.

显然,试图将对象从共享对象库中拉出来是/usr/bin/ld: attempted static link of dynamic object `libnamespec.so' collect2: error: ld returned 1 exit status 将要讨论的问题。

有一些建议here,但我对这个问题的兴趣仅仅是学术上的。

希望有所帮助。