我正在以共享库的形式构建调试内存工具,我在运行时链接可执行文件(包括malloc系列的重写方法).为了处理我的数据结构的初始化,我简单地使用了一个条件变量.每次调用malloc时,我都会检查变量是否未设置,然后调用一个负责初始化结构的函数.现在,这适用于运行单个执行线程的程序,但如果程序包含多个线程,则会出现问题.
唯一的方法(我能想到)确保在用户生成任何线程之前进行初始化是覆盖_init ,如此链接所示.
现在这个小例子运行正确,但是当我尝试在我自己的共享库中覆盖_init时,我在尝试链接时遇到此错误:
memory2.o: In function `_init':
memory2.c(.text+0x0): multiple definition of `_init'
/usr/lib/gcc/i686-linux-gnu/4.4.5/../../../../lib/crti.o(.init+0x0):
first defined here
collect2: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)
我使用与链接中的示例完全相同的步骤,只是我的共享库还包括一组全局变量和malloc/free的覆盖版本等.
任何人都可以给我一个指出错误的指针?此外,在覆盖_init时还有什么需要考虑的因素(我猜这不是一件很正常的事情).
谢谢
请查看以下常见问题页面:
http://www.faqs.org/docs/Linux-HOWTO/Program-Library-HOWTO.html#INIT-AND-CLEANUP
它描述_init/_fini为危险和过时,并建议使用__attribute__ ((constructor))和__attribute__ ((destructor))替代.
从gcc手册:
constructor (priority)destructor (priority)构造函数属性导致在执行输入之前自动调用该函数
main().类似地,析构函数属性导致在main()完成或调用函数后自动调用该函数exit().具有这些属性的函数对于初始化将在程序执行期间隐式使用的数据非常有用.您可以提供可选的整数优先级来控制构造函数和析构函数的运行顺序.具有较小优先级编号的构造函数在具有较大优先级编号的构造函数之前运行; 析构函数的相反关系成立.因此,如果您有一个分配资源的构造函数和一个释放相同资源的析构函数,那么这两个函数通常具有相同的优先级.构造函数和析构函数的优先级与为命名空间范围的C++对象指定的优先级相同(请参阅C++属性).目前,Objective-C尚未实现这些属性.