精灵文件中析构函数的位置:不是它应该在哪里?

时间:2013-11-04 20:59:19

标签: c gcc destructor elf

我用

注册了一个令牌析构函数
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。
  • ELF32-I386
  • 内核:3.2.0-30-generic-pae
  • gcc版本:4.6.3

1 个答案:

答案 0 :(得分: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,一个真正的指针,然后零终止。