我注册了一个令牌析构函数
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