【问题标题】:Change Symbol Visibility in Object File or Library ('t' -> 'T')更改对象文件或库中的符号可见性 ('t' -> 'T')
【发布时间】:2014-02-07 07:50:54
【问题描述】:

我需要更改目标文件或库中的符号可见性。例如,一个特定的共享对象有一个符号名称,但它是本地的,所以我不能绑定到它(较低的t 表示 TEXT 部分中的本地):

$ nm /usr/local/ssl/lib/libcrypto.so | grep -i OPENSSL_cpuid_setup
00000000000c3f80 t OPENSSL_cpuid_setup
000000000008a360 t fips_openssl_cpuid_setup

存档中存在相同的符号,但此项目中未使用存档(上面的T表示TEXT部分中的全局):

$ nm /usr/local/ssl/lib/libcrypto.a | grep -i OPENSSL_cpuid_setup
0000000000000310 T OPENSSL_cpuid_setup
000000000000f8e0 T fips_openssl_cpuid_setup

我希望OPENSSL_cpuid_setup 的可见性是全局的而不是本地的。

有没有办法改变目标文件或库中的符号可见性?我已经通过Binutil tools了,好像没有合适的工具。

为了完整起见,“最简单”的方法可用,因为源代码被隔离且无法更改。最简单的方法包括(1)从声明中删除static; (2) 使用 GCC 的可见性属性。

【问题讨论】:

    标签: c shared-libraries visibility symbols binutils


    【解决方案1】:

    您可以尝试(未经测试)objcopy--globalize-symbol 选项。但是,这仅适用于存档,而不适用于动态库,因为您可以修改普通符号表而不是(散列的)动态符号表。

    一个令人作呕的 hack 是确定例程与全局的偏移量(使用 objdump 并将其从您的 makefile 写入文件),然后创建一个函数指针,然后跳转到该位置(糟糕)。

    【讨论】:

      猜你喜欢
      • 2020-06-14
      • 2016-09-28
      • 2021-03-12
      • 2014-08-15
      • 2011-08-01
      • 2020-04-20
      • 2011-05-17
      • 2020-12-14
      • 2022-01-02
      相关资源
      最近更新 更多