Gcc 11 в Ubuntu 22.02 не связывает конструкторы библиотекLinux

Ответить
Anonymous
 Gcc 11 в Ubuntu 22.02 не связывает конструкторы библиотек

Сообщение Anonymous »

Как мне выяснить, почему gcc не может связать мою библиотеку (с помощью только конструктора lib) при сборке с помощью GCC 11 в Ubuntu 22.04?
Я привел здесь небольшой пример чтобы попытаться воспроизвести проблему: https://godbolt.org/z/PT4jETToj, проблема в том, что я не могу - на godbolt это работает. Проблема возникает только локально.
Конструктор библиотеки должен печатать вызванный конструктор библиотеки!, обратите внимание, как это происходит при сборке в контейнере, но не при сборке на моем хосте (

Код: Выделить всё

gcc (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0
)

Код: Выделить всё

❯ rm -rf main.gcc; docker run -it --rm -v $(pwd):/workspace gcc:11.4 bash -c "cd /workspace; ./build.sh" && ./main.gcc
Building GCC variant
Library constructor called!
Main program started!

❯ rm -rf main.gcc; ./build.sh && ./main.gcc
Building GCC variant
Main program started!
где запускается build.sh:

Код: Выделить всё

g++ -fPIC -shared -o libexample-gcc.so example.cpp \
&& g++ -std=c++17 -o main.gcc main.cpp -L. -lexample-gcc -Wl,-rpath,.
Это также работает, если я создаю его локально в clang. Я начал думать, что моя система просто сломана, но система моего коллеги (20.04, gcc 9.4) также не запускает конструктор библиотеки.
Похоже, проблема заключается между связыванием и временем выполнения. . Когда я добавляю флаг -Wl,--verbose, я вижу, что компоновщик видит libexample как для gcc, так и для clang

Код: Выделить всё

# verbose linker log
attempt to open ./libexample-gcc.so succeeded
./libexample-gcc.so
Но полученный двоичный файл gcc на моем хосте не показывает libexample в выводе ldd, тогда как он отображается, когда он собран с помощью clang. А поскольку его нет в списке компоновщиков, его нельзя запустить во время выполнения.
Символ четко определен в библиотеке

Код: Выделить всё

❯ nm -C libexample-gcc.so | rg library_constructor
0000000000001179 T library_constructor()
но библиотека полностью отсутствует в ldd:

Код: Выделить всё

❯ ( LD_LIBRARY_PATH=$(pwd) ldd main.gcc | rg example ) || echo "not found"
not found

❯ LD_LIBRARY_PATH=$(pwd) ldd main.clang | rg example
libexample-clang.so => /home/matt/workspace/lib_constructor_example/libexample-clang.so (0x00007d0188775000)
Это верно, даже если я явно добавляю --no-as-needed, т.е.

Код: Выделить всё

g++ -std=c++17 -o main.gcc main.cpp -L. -lexample-gcc -Wl,-rpath,. -Wl,--no-as-needed
Может ли быть что-то в моей среде или в настройках моей системы, что контролирует это?


Подробнее здесь: https://stackoverflow.com/questions/792 ... nstructors
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Linux»