2011-04-19 103 views
5

我的问题与this question不一样。是否可以静态链接到共享对象?

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

我试图移动到一个较新的工具集来构建,但一些旧工具集可用的静态库现在不可用 - 例如,提供了_start的crt库aren在这个工具集中没有提供。

我已经挖通过提供与供应商的工具包中的文件,发现与我从CRT库所需的符号一些共享对象(例如,_start,_fini等),但我不确定是否有一个直接将一个共享对象静态链接到一个二进制文件中,并且还可以执行该二进制文件。

简版:非共享对象二进制文件可以静态链接到共享对象而不会变成另一个共享对象吗?

+0

您的原始独立二进制文件是否已被静态链接?你能否提供一些关于你实际拥有的细节,以及你需要达到什么? – 2011-07-31 11:32:51

+0

在最初的项目中,使用旧的工具集时,有一些提供的(静态)库,链接时使它成为独立的可运行二进制文件。在较新的工具集中,其中一些东西缺少静态库,但有几个共享对象提供这些符号。基本上我想知道的是,共享对象可以静态链接到独立的二进制文件中。 – 2011-08-01 17:51:50

+0

最后一个问题的确切答案是“不”。当您创建共享库时,静态链接所需的信息将不可挽回地丢失。 – 2011-08-01 18:07:10

回答

6

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

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

2

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

要真正地演示了静态链接的共享对象库是不可能的ldgcc的链接),请使用以下命令gcc

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

(当然,你必须编译objectname.osourcename.c,并且你应该弥补自己的共享对象库为好。如果这样做,使用-Wl,--library-path,.让LD可以找到你的库在本地目录。)

实际的错误,你收到的是:

/usr/bin/ld: attempted static link of dynamic object `libnamespec.so' 
collect2: error: ld returned 1 exit status 

显然,试图拉对象从共享对象库的一些关于这ld在所不惜。

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

希望有所帮助。

相关问题