2

我注册了一个令牌析构函数

static void cleanup __attribute__ ((destructor));

该函数只打印一条调试消息;令牌程序运行良好(main() 只打印另一条消息;令牌函数在退出时打印)。

当我查看文件时

nm ./a.out,

我懂了: 

08049f10 d __DTOR_END__

08049f0c d __DTOR_LIST__

但是,令牌析构函数的地址应该在0x08049f10- 一个包含 0 的地址,表示析构函数列表的结尾,我可以使用以下命令进行检查:

objdump -s ./a.out

0x08049f0c,我看到0xffffffff,正如该位置所预期的那样。据我了解,我在 elf 文件中看到的内容意味着没有注册析构函数;但它是用一个执行的。

如果有人可以解释,我将不胜感激。安全套件的这一部分是为了防止插入恶意析构函数吗?编译器如何跟踪析构函数的地址?

我的系统:

  • Ubuntu 12.04。
  • 精灵32-i386
  • 内核:3.2.0-30-generic-pae
  • gcc 版本:4.6.3
4

1 回答 1

0

DTOR_LIST是析构函数表的开始。看看它在哪个部分(可能是.dtors):

~> objdump -t test | grep DTOR_LIST
0000000000600728 l     O .dtors 0000000000000000              __DTOR_LIST__

然后用 readelf (或其他)转储该部分:

~> readelf --hex-dump=.dtors test

Hex dump of section '.dtors':
  0x00600728 ffffffff ffffffff 1c054000 00000000 ..........@.....
  0x00600738 00000000 00000000                   ........

在我的测试用例中,其中包含几个大概 -1、一个真正的指针,然后是零终止。

于 2014-09-10T13:01:31.110 回答