Мне просто интересно. Я создал общий объект:
gcc -o liba.so -fPIC -shared liba.c
И еще один общий объект, который ссылается на прежний:
gcc -o libb.so -fPIC -shared libb.c liba.so
Теперь при создании исполняемого файла, который ссылается на libb.so
, мне нужно будет указать -rpath-link для ld, чтобы он мог найти liba.so
, когда обнаружил, что libb.so
зависит от него:
gcc -o test -Wl,-rpath-link,./ test.c libb.so
иначе ld будет жаловаться.
Почему это, что ld ДОЛЖЕН быть в состоянии найти liba.so
при связывании test
? Поскольку мне кажется, что ld не делает ничего, кроме подтверждения существования liba.so
. Например, при запуске readelf --dynamic ./test
при необходимости отображается только libb.so
, поэтому я предполагаю, что динамический компоновщик должен самостоятельно определить зависимость libb.so -> liba.so
и сделать его собственным поиском liba.so
.
Я на платформе GNU/Linux x86-64, а основная() - процедура в test
вызывает функцию в libb.so
, которая, в свою очередь, вызывает функцию в liba.so
.