【问题标题】:Finding Statically Allocated Data Blocks in a Static Library在静态库中查找静态分配的数据块
【发布时间】:2012-05-07 19:51:57
【问题描述】:

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

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

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

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

【问题讨论】:

  • 如果是你的库,不能直接改接口暴露吗?
  • 不;这不是我的图书馆。它只是坏了。

标签: c linux memory assembly


【解决方案1】:

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

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

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

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 也是如此)。

更新:

objectdump 的 -dr 不起作用

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

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

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

声明“extern int grid[];”并使用它给出一个未定义的引用

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

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

如果不首先对符号进行全球化,您将无法从 foo.o 外部引用此 grid

出于安全原因,我不允许在我们的服务器上运行已更改的库二进制文件

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

【讨论】:

  • 感谢您的回复!是的,Ubuntu 10.04。 objectdump 的 -dr 不起作用,但我确实使用 nm 找到了数组。相关输出类似于:“00000000006b5ec0 b grid\n00000000006c8620 b grid\n00000000006da4a0 b grid\n00000000006ec320 b grid\n00000000006fe1a0 b grid”。
  • 地址 0x6b5ec0 与程序集中引用的地址相同(尽管我想知道为什么输出多行?)。不幸的是,声明“extern int grid[];”并使用它给出了一个未定义的引用,所以我怀疑它被声明为静态全局的。出于安全原因,我不允许在我们的服务器上运行已更改的库二进制文件,所以很遗憾,即使是为了测试,我也不能将其全球化。
  • 多行输出有编程错误的味道。这可能是原始代码中的static 变量,实际上在三个不同的编译单元中实例化。所以不是一个阵列,而是三个阵列,您观察到的故障可能正是出于这个原因。
  • @JensGustedt 我完全不同意你的评论。声明 5 个单独的静态数组实例有什么问题,它们都恰好命名为 grid,但彼此没有关系?
  • @EmployedRussian,本身没有错,这只是我要看的第一件事:)
猜你喜欢
  • 2018-12-09
  • 2015-08-02
  • 1970-01-01
  • 1970-01-01
  • 2022-01-14
  • 1970-01-01
  • 2014-05-21
  • 2022-01-05
  • 1970-01-01
相关资源
最近更新 更多