Я привел здесь небольшой пример чтобы попытаться воспроизвести проблему: 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!
Код: Выделить всё
g++ -fPIC -shared -o libexample-gcc.so example.cpp \
&& g++ -std=c++17 -o main.gcc main.cpp -L. -lexample-gcc -Wl,-rpath,.
Похоже, проблема заключается между связыванием и временем выполнения. . Когда я добавляю флаг -Wl,--verbose, я вижу, что компоновщик видит libexample как для gcc, так и для clang
Код: Выделить всё
# verbose linker log
attempt to open ./libexample-gcc.so succeeded
./libexample-gcc.so
Этот символ четко определен в библиотеке
Код: Выделить всё
❯ nm -C libexample-gcc.so | rg library_constructor
0000000000001179 T library_constructor()
Код: Выделить всё
❯ ( 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)
Код: Выделить всё
g++ -std=c++17 -o main.gcc main.cpp -L. -lexample-gcc -Wl,-rpath,. -Wl,--no-as-needed
Подробнее здесь: https://stackoverflow.com/questions/792 ... nstructors
Мобильная версия