Что такое символ "___emutls_get_address"? - PullRequest
7 голосов
/ 25 октября 2011

О, я новичок в GCC, MAC и Makefile.Сегодня я намеревался создать динамическую библиотеку, используя MAC OS X и GCC 4.4.2, но при связывании файлов .o компилятор жалуется так:

Undefined symbols:
  "___emutls_get_address", referenced from:
      _malloc in michael.o
      _malloc in michael.o
ld: symbol(s) not found

Я гуглил эту информацию, но я не могу 'Я не очень хорошо понимаю результаты, мне интересно, что означает этот символ и почему во многих программах есть такая ошибка компоновки.Мне также интересно, какова возможная причина этой ошибки, команда связывания:

g++ -Dx86 -D_GNU_SOURCE -D_REENTRANT  -Wall -m32 \
    -fno-strict-aliasing -fno-pic -O3 -ggdb \
    michael.o malloc_new.o -o libmichael.so \
    -lpthread -lm -lstdc++  -shared

1 Ответ

5 голосов
/ 25 октября 2011

Этот символ является частью эмуляции TLS (локальное хранилище потоков) с помощью gcc для Mac OS X. В gcc bugzilla есть некоторые ошибки по этому поводу, например: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=39888

Использование локального хранилища потока (например, переменных OpenMP ThreadPrivate) в Darwin требует ручной связи с TLS emutls через -lgcc_s.so.1 или -lgcc_eh

Смотрите темы: http://gcc.gnu.org/ml/gcc/2008-12/msg00145.html http://gcc.gnu.org/ml/gcc/2008-12/msg00107.html

Из вышеперечисленных тем это явно беспорядок. Однако, как я только что Постепенно я надеялся, что будет полезно иметь ошибку, отслеживающую проблему.

...

TLS работает нормально, если я вручную ссылаюсь на gcc_s.so.1 или gcc_eh, как упомянуто выше.

Итак, одно из возможных решений - добавить опцию -lgcc_s.so.1 или -lgcc_eh к шагу связывания. И другое - обновить ваш gcc, потому что это ошибка gcc.

...