Порядок, в котором ld-linux.so выполняет CTOR? - PullRequest
0 голосов
/ 26 марта 2011

Я знаю, что это связано с порядком, в котором общие объекты указываются в командной строке компоновщика, т. Е. Если вы сделаете это:

gcc -o main main.c -lA -lB

CTOR в libB будут выполняться раньшев libA.

Стандартизировано ли это поведение?Могу ли я использовать его в среде, предназначенной для переноса между аппаратными платформами?

PS CTOR - это функция с __attribute__((constructor)).

Ответы [ 2 ]

3 голосов
/ 26 марта 2011

Приложение, которое зависит от этого, чрезвычайно хрупкое ... Также многие люди считают любое использование глобальных конструкторов, особенно в C, серьезным нарушением и основанием для отказа от использования библиотеки. pthread_once предоставляет гораздо более чистый способ получить такую ​​же безопасную инициализацию, при этом программистам, использующим вашу библиотеку, не нужно беспокоиться о том, что вы могли испортить начальное состояние программы до ввода main.

0 голосов
/ 26 марта 2011

Весь механизм __attribute__ является специфическим расширением gcc.Следовательно, это не стандартизировано.

C сам по себе не имеет понятия динамических конструкторов переменных со статическим хранилищем или подобных вещей.Единственное, что у него есть - это инициализация такой переменной с помощью константных выражений компиляции.

В потоках POSIX есть ряд инструментов, которые работают вокруг этого.Р. уже упомянул pthread_once.pthread_mutex_t и pthread_cond_t имеют макросы, которые оценивают как постоянное выражение.Тем самым они могут быть использованы в качестве инициализатора для переменных в глобальной области видимости.

...