【问题标题】:Is it possible to statically link against a shared object?是否可以静态链接到共享对象?
【发布时间】:2011-04-19 17:20:53
【问题描述】:

我的问题和this question不一样。

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

我正在尝试使用更新的工具集进行构建,但旧工具集提供的一些静态库现在不可用 - 例如,提供 _start。

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

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

【问题讨论】:

  • 您的原始独立二进制文件是静态链接的可执行文件吗?您能否详细说明您实际拥有什么以及您需要实现什么?
  • 在原始项目中,使用旧工具集,有一些提供的(静态)库,当链接进来时,它会成为一个独立的可运行二进制文件。在较新的工具集中,其中一些东西作为静态库丢失了,但是有一些共享对象提供了这些符号。本质上我想知道的是,共享对象是否可以静态链接到独立的二进制文件中。
  • 最后一个问题的最终答案是“否”。创建共享库时,静态链接所需的信息将不可挽回地丢失。
  • 如果是这样的话......如果你想写出来,我会接受这个答案,感谢你提供一些关于丢失的信息。

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


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    要实际证明使用ldgcc 的链接器)无法静态链接共享对象库,请使用以下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
    

    显然,尝试将对象从共享对象库中拉出是 ld 会拒绝的事情。

    here 提出了一些建议,但我对这个问题的兴趣只是学术性的。

    希望对您有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-18
      • 1970-01-01
      • 1970-01-01
      • 2010-11-17
      • 1970-01-01
      • 1970-01-01
      • 2020-10-28
      • 1970-01-01
      相关资源
      最近更新 更多