Jakie są opcje wiersza poleceń --start-group i --end-group?

83

Jaki jest cel tych opcji wiersza poleceń? Proszę o pomoc w rozszyfrowaniu znaczenia następującego wiersza poleceń:

Najwyraźniej ma to coś wspólnego z linkowaniem, ale w podręczniku GNU jest cicho, co dokładnie oznacza grupowanie.

pic11
źródło

Odpowiedzi:

97

Służy do rozwiązywania zależności cyklicznych między kilkoma bibliotekami (na liście od -(do -)).

Cytowanie Dlaczego kolejność łączenia bibliotek czasami powoduje błędy w GCC? lub man ld http://linux.die.net/man/1/ld

-( archiwa -) lub --start-group archiwa --end-group

Te archiwa powinny być lista plików archiwalnych. Mogą to być jawne nazwy plików lub opcje -l.

Określone archiwa są wielokrotnie przeszukiwane, dopóki nie zostaną utworzone żadne nowe niezdefiniowane odniesienia. Zwykle archiwum jest przeszukiwane tylko raz w kolejności określonej w wierszu poleceń. Jeśli symbol w tym archiwum jest potrzebny do rozwiązania niezdefiniowanego symbolu, do którego odwołuje się obiekt w archiwum, który pojawia się później w wierszu poleceń, konsolidator nie byłby w stanie rozwiązać tego odniesienia. Grupując archiwa, wszystkie są wielokrotnie przeszukiwane, aż wszystkie możliwe odniesienia zostaną rozwiązane.

Korzystanie z tej opcji wiąże się ze znacznymi kosztami wydajności. Najlepiej jest używać go tylko wtedy, gdy istnieją nieuniknione cykliczne odniesienia między dwoma lub więcej archiwami.

Tak więc biblioteki wewnątrz grupy można kilkakrotnie przeszukiwać pod kątem nowych symboli i nie potrzebujesz żadnych brzydkich konstrukcji, takich jak -llib1 -llib2 -llib1

Archiwum PS to w zasadzie statyczna biblioteka ( *.apliki)

osgx
źródło
1
Przyjęty. Uwaga: uważam, że GCC wybiera najpierw biblioteki dynamiczne, chyba że pełna nazwa pliku (w tym ścieżka i przyrostek .a) jest podana w linii poleceń. -llib1 spowoduje, że GCC spróbuje najpierw dowiązać do pliku% .so, a następnie spróbuje pliku% .a.
pic11
1
@ pic11, dzięki. Linkowanie jest wykonywane przez ld i możesz zobaczyć, jak przeszukiwane są biblioteki, dodając -Wl,--verboseopcję do gcc (zostanie ona przekazana --verbosedo linkera ld). Na przykład dla -ltestbiblioteki: 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 . Linker próbuje .sonajpierw otworzyć , ale potem próbuje otworzyć .a. Odbywa się to w każdym katalogu w katalogach wyszukiwania bibliotek.
osgx
„kilka razy szukał nowych symboli”? Myślę, że dwukrotne wyszukanie wystarczy, aby rozwiązać wszystkie symbole. To nie powinno być znaczącym kosztem wydajności.
Jimm Chen
10
Przepraszam, w końcu zdałem sobie sprawę, że „wyszukiwanie dwa razy” to za mało.
Jimm Chen