gpt4 book ai didi

更改目标文件或库中的符号可见性 ('t' -> 'T' )

转载 作者:太空宇宙 更新时间:2023-11-03 23:50:27 27 4
gpt4 key购买 nike

我需要更改对象文件或库中的符号可见性。例如,一个特定的共享对象有一个符号名称,但它是本地的,所以我无法绑定(bind)到它(较低的 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 的可见性属性。

最佳答案

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

一个令人作呕的 hack 是确定例程与全局变量的偏移量(使用 objdump 并将其写入 makefile 中的文件),然后创建一个函数指针,然后跳转到那个(讨厌)。

关于更改目标文件或库中的符号可见性 ('t' -> 'T' ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21195107/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com