我知道它与链接器命令行中指定共享对象的顺序有关,即如果你这样做:
gcc -o main main.c -lA -lB
libB中的CTOR将在libA中运行。
这种行为是否标准化?我可以在一个可以在硬件平台之间移植的框架中使用它吗?
P.S。 CTOR是具有__attribute__((constructor))
内容的函数。
答案 0 :(得分:3)
依赖于此的应用程序非常脆弱......还有许多人认为任何使用全局构造函数,尤其是在C中,一个主要的攻击和不使用库的理由。 pthread_once
提供了一种更清晰的方式来获得相同的安全初始化,而程序员不必使用您的库,而不必担心您可能在输入main
之前搞砸了程序的初始状态。
答案 1 :(得分:0)
所有__attribute__
机制都是gcc特定的扩展。因此,这不是标准化的。
C本身没有静态存储或类似事件的变量动态构造函数的概念。它唯一具有的是使用编译常量表达式初始化此类变量。
POSIX线程中有许多工具可以解决这个问题。 R ..已经提到了pthread_once
。 pthread_mutex_t
和pthread_cond_t
具有评估为常量表达式的宏。因此,它们可以用作全局范围内变量的初始化器。