Какие есть параметры командной строки --start-group и --end-group?

83

Какова цель этих параметров командной строки? Пожалуйста, помогите расшифровать значение следующей командной строки:

Очевидно, это как-то связано с линковкой, но в руководстве GNU ничего не говорится о том, что именно означает группировка.

pic11
источник

Ответы:

97

Он предназначен для разрешения круговых зависимостей между несколькими библиотеками (перечисленными между -(и -)).

Цитирование Почему порядок, в котором библиотеки связаны, иногда вызывает ошибки в GCC? или man ld http://linux.die.net/man/1/ld

-( архивы -) или --start-group архивы --end-group

В архивах должны быть списком архивных файлов. Это могут быть явные имена файлов или параметры -l.

Поиск в указанных архивах выполняется повторно, пока не перестанут создаваться новые неопределенные ссылки. Обычно поиск в архиве выполняется только один раз в порядке, указанном в командной строке. Если символ в этом архиве необходим для разрешения неопределенного символа, на который ссылается объект в архиве, который появляется позже в командной строке, компоновщик не сможет разрешить эту ссылку. Сгруппировав архивы, все они будут подвергаться многократному поиску, пока не будут разрешены все возможные ссылки.

Использование этой опции требует значительных затрат производительности. Лучше всего использовать его только тогда, когда есть неизбежные циклические ссылки между двумя или более архивами.

Итак, библиотеки внутри группы можно искать несколько раз на предмет новых символов, и вам не нужны уродливые конструкции вроде -llib1 -llib2 -llib1

Архив PS означает в основном статическую библиотеку ( *.aфайлы)

osgx
источник
1
Принятый. Замечание: я считаю, что GCC сначала обращается к динамическим библиотекам, если полное имя файла (включая путь и суффикс .a) не передается в командной строке. -llib1 приведет к тому, что GCC сначала попытается установить ссылку на файл% .so, а затем попробует файл% .a.
pic11
1
@ pic11, спасибо. Связывание выполняется с помощью ld, и вы можете увидеть, как выполняется поиск в библиотеках, добавив -Wl,--verboseпараметр в gcc (он передается --verboseкомпоновщику ld). Например , для -ltestбиблиотеки: attempt to open /lib/libtest.so failed \n attempt to open /lib/libtest.a failed \n attempt to open /usr/lib/libtest.so failed \n attempt to open /usr/lib/libtest.a failed \n . Компоновщик .soсначала пытается открыть , но потом пытается открыть .a. Это делается в каждом каталоге в каталогах поиска библиотеки.
osgx
"несколько раз искал новые символы"? Я думаю, что дважды поиск достаточно, чтобы разрешить все символы. Это не должно быть значительным снижением производительности.
Джимм Чен
10
Извините, я наконец понял, что "дважды искать" недостаточно.
Джимм Чен