gpt4 book ai didi

c - 在静态库中查找静态分配的数据 block

转载 作者:太空狗 更新时间:2023-10-29 11:46:34 25 4
gpt4 key购买 nike

我有一个小型静态库 (.a)。在静态库中有一个指针指向一个大的、静态分配的一维数组。

当我将我的代码链接到这个库时,指针的地址被硬编码在不同的位置,通过反汇编很容易找到。问题是,我希望我的代码能够访问这个数组(库出错,我想知道原因)。

当然,通过反汇编、将该地址硬编码到我的代码中,然后重新编译来获取该指针是微不足道的。这不会是一个问题,除非库可以用不同的方式与其他模块一起配置,并且数组的指针会根据链接的模块而改变。

获取该指针的选项有哪些?因为数组的起始状态是可预测的,所以我可以遍历内存,使用信号处理程序捕获段错误,直到找到看起来合理的东西。有没有更好的办法?

最佳答案

由于您的库是一个 .a 存档,我假设您使用的是某种 UNIX。

全局数组应该有一个与之关联的符号名称。您的工作会更容易或更困难,具体取决于描述它的符号类型。

如果有一个全局符号描述这个数组,那么你可以直接引用它,例如

extern char some_array[];
for (int i = 0; i < 100; i++) printf("%2d: 0x%2x\n", i, some_array[i]);

如果符号是本地的,那么您可以先使用objcopy --globalize-symbol=some_array 将其全局化,然后按上述操作。

那么如何确定描述该数组的符号是什么?运行 objdump -dr foo.o,其中 foo.o 包含您知道引用该数组的指令。将出现在推荐说明旁边的搬迁将告诉您名称。

最后,运行 nm foo.o | grep some_array.如果您看到 00000XX D some_array,您就完成了——该数组是全局可见的(对于 B 也是如此)。如果您看到 000XX d some_array,您需要先将其全局化(对于 b 也是如此)。

更新:

The -dr to objectdump didn't work

是的,因为符号原来是本地的,所以重定位可能是指.bss + 0xNNN

00000000006b5ec0 b grid
00000000006c8620 b grid
00000000006da4a0 b grid
00000000006ec320 b grid
00000000006fe1a0 b grid

您必须在最终链接的可执行文件上运行 nm,而不是在存档内的单个 foo.o 对象上运行。在您的二进制文件中有五个独立静态数组,称为 grid,只有第一个是您显然关心的。

declaring "extern int grid[];" and using it gives an undefined reference

这是本地符号的预期:库中的代码类似于:

// foo.c
static char grid[1000];

如果不先将符号全局化,就不能从 foo.o 外部引用此 grid

I'm not allowed to run a changed binary of the library on our server for security reasons

我希望你明白那个论点完全是胡说八道:如果你可以将你自己的代码链接到那个二进制文件中,那么你就可以在服务器上做任何(受制于用户 ID 限制);你已经被信任了。如果服务器管理员不信任您,修改第三方库应该是他最不担心的事情。

关于c - 在静态库中查找静态分配的数据 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10344296/

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