Ответ здесь демонстрирует, что __attribute __ ((конструктор)) не называется после статической инициализации он вызывается в порядке объявления.
Тогда какова его цель, если ее вызов не гарантируется, когда все данные инициализированы? Мы также могли бы иметь наш ((конструктор)) код в конструкторе Foo.
Я ищу способ иметь в общей библиотеке код, который будет выполняться после инициализации всех статических данных и вызова статических конструкторов. Я видел, как люди рекомендовали __attribute __ ((конструктор)) в качестве замены DllMain; как мы видим, это неправильно, потому что некоторые статические данные все еще могут быть не инициализированы.
Конечно, в одном файле (блоке компиляции) статику можно расположить. Но в типичной программе файлов много. Есть ли способ гарантировать, что ((конструктор)) в одном файле будет определенно вызываться после инициализации всех остальных статик в общей библиотеке?
Если я помещу файл со статической инициализацией (конструктор, объект и т. Д.) В конец командной строки gcc:
g++ -shared -fPIC source1.o source2.o MyLastInitChance.o
гарантированно ли статические конструкторы этого файла будут вызываться последними? Я экспериментировал, и когда я меняю порядок исходных файлов, порядок printfs меняется; но указано ли оно где-то и гарантированно ли оно будет одинаковым для разных систем компиляции / компьютеров?
Например, цитата:
Во время компоновки драйвер gcc помещает crtbegin.o непосредственно перед всеми перемещаемыми файлами и crtend.o сразу после всех перемещаемых файлов.
Насколько я понимаю, приведенная выше цитата подразумевает, что порядок файлов .o, передаваемых компоновщику, определяет порядок статической инициализации. Я прав?
Еще одно интересное возможное решение, возможно, - написать плагин GCC, который регулирует статическую инициализацию (например, добавляет код в раздел .ctors и т. Д.). Но это всего лишь идея, которую, может быть, кто-то сможет расширить.
Еще одно возможное решение представлено здесь. Короче говоря, для изменения порядка записей .ctors в исполняемом файле (библиотеке) можно использовать внешний инструмент после сборки. Но я не эксперт в формате ELF; Интересно, возможно ли и достаточно ли просто настроить файлы .so таким образом.
Меня интересует решение конкретной проблемы или доказательство того, что ее невозможно решить (по крайней мере, почему приведенные выше решения не работают).
__attribute((constructor))__
имеет больше смысла для чистого C, чем для C ++. - person Oliver Charlesworth   schedule 19.06.2012DllMain
у вас не работает? - person TonyK   schedule 24.06.2012