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

| 我的问题与这个问题不同。 我正在使用具有独立二进制文件的项目进行工作,该二进制文件没有动态/外部链接,并且在* nix环境中运行。 我正在尝试使用一个较新的工具集进行构建,但是一些较旧的工具集可用的静态库现在不可用-例如,不提供提供_start的crt库在此工具集中。 我一直在浏览供应商工具集随附的文件,并从crt库中找到了一些带有所需符号的共享对象(例如_start,_fini等),但是我不确定是否存在一种将共享库静态链接到二进制文件并进一步使该二进制文件可执行的简单方法。 简短版本:非共享对象二进制文件可以与共享对象静态链接,而结果不会成为另一个共享对象吗?     
已邀请:
共享库和静态库之间有根本的区别。首先,请在此站点上搜索先前的讨论,并查看该问题(以及其中的答案)。 基本上,静态库只是对象的集合,链接器将符号名称解析为固定地址,这是静态链接所必需的。另一方面,共享库更像一个独立的可执行文件,它由加载程序加载到内存中,并具有程序跳转到的入口地址。但是,在链接共享库时,通常不会保留静态库具有的重定位表,因此通常无法从链接的共享库内部提取可链接的对象代码。     
是的,我知道这是一个有6年历史的问题。有人告诉我可以静态链接到共享库,但是我也发现不是。 要实际演示使用
ld
gcc
\的链接器)无法静态链接共享库,请使用以下
gcc
命令:
gcc -o executablename objectname.o -Wl,-Bstatic -l:libnamespec.so
(当然,您必须从
sourcename.c
编译
objectname.o
,并且您可能还应该组成自己的共享库。如果这样做,请使用
-Wl,--library-path,.
,以便ld在本地目录中找到您的库。) 您收到的实际错误是:
/usr/bin/ld: attempted static link of dynamic object `libnamespec.so\'
collect2: error: ld returned 1 exit status
显然,试图将对象从共享库中拉出来是关于“ 0”的事情。 这里提出了一些建议,但是我对这个问题的兴趣只是学术上的。 希望能有所帮助。     

要回复问题请先登录注册