如何让GCC __attribute __((构造函数))在OSX下工作?

时间:2009-10-06 17:09:27

标签: c macos gcc

extern void MyInitFunc(void) __attribute__ ((constructor));
extern void MyTermFunc(void) __attribute__ ((destructor));

void MyInitFunc(void)
{
  printf("%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n");
}

void MyTermFunc(void)
{
}

我把它放在主应用程序(不是库或框架)中的.c文件中。根据GCC文档,它不会被调用。我错过了重要的事吗?这是在Snow Leopard的XCode 3.2上。

2 个答案:

答案 0 :(得分:9)

这可能解释了Snow Leopard上报告的一些奇怪错误,但前提是这个结构在早期版本中有效。

你是正确的MyInitFunc应该纯粹是因为与程序链接而被调用,即使程序是普通的C89,即使其余部分完全是其他语言。

问题是系统上的C启动代码没有查看.ctors部分和.dtors部分的构造函数和析构函数的地址。我不确定这是否适用于所有平台,但通常这是__do_global_ctorslibgcc的一部分。

这是一个平台错误,或者,你的gcc构建错误,或者,Apple只是决定以不同的方式做事,gcc不能正确支持该平台。

您可以尝试cc -v ...并检查是否正在调用collect2而不是ld

答案 1 :(得分:3)

(a)您的代码适用于我在Xcode 3.2中编译和运行SnowLeopard。

(b)我不确定何时确保设置了stdout。你在main之前运行代码。为什么不在这里更新全局变量,然后在main中打印出来以查看代码是否已运行。