Вам придется прочитать документацию для вашего компоновщика. Начиная с info ld
в моей системе Linux / ELF / GNU Binutils (выделение добавлено):
`--as-needed'
`--no-as-needed'
This option affects ELF DT_NEEDED tags for dynamic libraries
mentioned on the command line after the `--as-needed' option.
<b>Normally the linker will add a DT_NEEDED tag for each dynamic
library mentioned on the command line, regardless of whether the
library is actually needed or not.</b> `--as-needed' causes a
DT_NEEDED tag to only be emitted for a library that satisfies an
undefined symbol reference from a regular object file or, if the
library is not found in the DT_NEEDED lists of other libraries
linked up to that point, an undefined symbol reference from
another dynamic library. `--no-as-needed' restores the default
behaviour.
Вы можете проверить себя, запустив ldd
в тестовой программе. На простой тестовой программе я получаю:
linux-vdso.so.1 => (0x00007fffd8305000)
libc.so.6 => /lib/libc.so.6 (0x00007f646c669000)
/lib/ld-linux-x86-64.so.2 (0x00007f646c9ca000)
Однако, если я свяжусь с -ldl
, я получу это:
linux-vdso.so.1 => (0x00007fff644f1000)
libdl.so.2 => /lib/libdl.so.2 (0x00007fb9b1375000)
libc.so.6 => /lib/libc.so.6 (0x00007fb9b1014000)
/lib/ld-linux-x86-64.so.2 (0x00007fb9b1579000)
Хотя libdl
не используется моей программой. Однако, если я запускаю GCC с -Wl,--as-needed
, libdl
не будет связан. Согласно моим тестам, это работает, только если в командной строке указан *1017* до -ldl
.
Каковы эффекты? Это означает, что ваш двоичный файл не будет работать в системах без разделяемой библиотеки, даже если вы ее не используете. Это также означает, что ваш двоичный файл сломается, если вы обновите общую библиотеку и удалите старую. Это не имеет большого значения, потому что бинарная совместимость в любом случае имеет значение, но я не вижу причин не включать -Wl,--as-needed
для проектов в целом.