Мне просто интересно. Я создал общий объект:
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.