Как мне заставить GCC __attribute__ ((конструктор)) работать под OSX? - PullRequest
0 голосов
/ 06 октября 2009
extern void MyInitFunc(void) __attribute__ ((constructor));
extern void MyTermFunc(void) __attribute__ ((destructor));

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

void MyTermFunc(void)
{
}

Я помещаю это в файл .c, который присутствует в основном приложении (не в библиотеке или в фреймворке). Это не вызывается в соответствии с документами GCC. Я что-то упустил? Это на XCode 3.2 на Snow Leopard.

Ответы [ 2 ]

9 голосов
/ 06 октября 2009

Это может объяснить некоторые странные ошибки, о которых сообщалось в Snow Leopard, но только если эта конструкция работала в более ранних выпусках.

Вы правы в том, что MyInitFunc должен был быть вызван исключительно в результате связи с программой, даже если программа простая C89, даже если остальная часть полностью является другим языком.

Проблема в том, что код запуска C в вашей системе не ищет в разделе .ctors и в разделе .dtors адреса конструкторов и деструкторов. Я не уверен, верно ли это для всех платформ, но обычно это __do_global_ctors, часть libgcc.

Это ошибка платформы, или ваш gcc был построен неправильно, или Apple просто решила действовать по-другому, и gcc не поддерживает платформу должным образом.

Вы можете попробовать cc -v ... и убедиться, что вызывается collect2 вместо ld напрямую.

3 голосов
/ 07 октября 2009

(a) У меня работает ваш код, который компилируется и запускается на SnowLeopard в Xcode 3.2.

(b) Я не уверен, когда stdout гарантированно настроен. Вы запускаете код перед main. Почему бы не обновить глобальную переменную здесь, а затем распечатать ее в main, чтобы увидеть, работает ли ваш код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...