我用
注册了一个令牌析构函数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文件中看到的意思是没有注册析构函数;但它是用一个执行的。
如果有人可以解释,我会很感激。这部分安全套件是否可以防止插入恶意析构函数?编译器如何跟踪析构函数的地址?
我的系统:
答案 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,一个真正的指针,然后零终止。