ld-linux.so执行CTOR的顺序?

时间:2011-03-26 14:44:04

标签: c linker elf

我知道它与链接器命令行中指定共享对象的顺序有关,即如果你这样做:

gcc -o main main.c -lA -lB

libB中的CTOR将在libA中运行。

这种行为是否标准化?我可以在一个可以在硬件平台之间移植的框架中使用它吗?

P.S。 CTOR是具有__attribute__((constructor))内容的函数。

2 个答案:

答案 0 :(得分:3)

依赖于此的应用程序非常脆弱......还有许多人认为任何使用全局构造函数,尤其是在C中,一个主要的攻击和不使用库的理由。 pthread_once提供了一种更清晰的方式来获得相同的安全初始化,而程序员不必使用您的库,而不必担心您可能在输入main之前搞砸了程序的初始状态。

答案 1 :(得分:0)

所有__attribute__机制都是gcc特定的扩展。因此,这不是标准化的。

C本身没有静态存储或类似事件的变量动态构造函数的概念。它唯一具有的是使用编译常量表达式初始化此类变量。

POSIX线程中有许多工具可以解决这个问题。 R ..已经提到了pthread_oncepthread_mutex_tpthread_cond_t具有评估为常量表达式的宏。因此,它们可以用作全局范围内变量的初始化器。