c - 如何让 GCC __attribute__ ((constructor)) 在 OSX 下工作?

标签 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 上。

最佳答案

这或许可以解释 Snow Leopard 上报告的一些奇怪错误,但前提是此构造在早期版本中有效。

你是对的,MyInitFunc 应该纯粹是作为与程序链接的结果被调用,即使程序是普通的 C89,即使它的其余部分完全是其他语言.

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

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

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

关于c - 如何让 GCC __attribute__ ((constructor)) 在 OSX 下工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1526882/

相关文章:

objective-c - 自定义基于 View 的 nstableview 调整大小

macos - 在 lion 上损坏的 brew 安装的 postgresql

c++ - 如何在取消引用空指针时创建错误?

c - 从代码中断程序中删除 printf 语句

c - 程序通过 valgrind memcheck 提前终止

c - 父进程在无限循环中杀死子进程

sql - 临* C : How to implement Dynamic SQL for inserting data

c 函数调用

objective-c - 不使用 XCode/Objective-C 的 OS X 开发?

c - 强制结构与 `__attribute__((packed,aligned(N)))` 对齐是否具有前瞻性?