2015-04-01 5 views
7

Najlepszym wyjaśnieniem udało mi się znaleźć to z oficjalnego dokumentu:Co to jest częściowe łączenie w GNU Linkerze?

-r --relocateable Generowanie wyjście relocatable - tj wygenerować plik wyjściowy, który z kolei może służyć jako wejście do ld.. Jest to często nazywane częściowe łączenie. Jako efekt uboczny, w środowiskach, które obsługują standardowe magiczne liczby uniksowe , ta opcja ustawia również magiczną liczbę pliku wyjściowego na OMAGIC . Jeśli ta opcja nie zostanie określona, ​​zostanie wygenerowany bezwzględny plik . Podczas łączenia programów w C++, ta opcja nie będzie rozstrzygać odniesień do konstruktorów; Aby to zrobić, użyj -Ur. Ta opcja działa tak samo jak "-i".

Jestem szczególnie zainteresowany tym, co dzieje się z symbolami obecnymi w wejściach do linkera. Weź konkretny przypadek, gdy mam statyczną bibliotekę libstatic.a, która zawiera pojedynczy plik obiektowy component.o. Teraz chcę utworzyć kolejną bibliotekę statyczną libfinal.a, która będzie działać jako interfejs do libstatic.a. Używam tego polecenia, aby go utworzyć:

ld -r -o libfinal.a wrapper.o -L. -lstatic

Gdzie wrapper.o zapewnia wyłączne API zadzwonić do funkcji zdefiniowanych w libstatic.a

Czy libfinal.a być tylko w połączeniu archiwum zawierające wrapper.o i component.o lub wszystkie odniesienia, które można rozwiązać między wrapper.o i component.o rozwiązać (połączyć), a następnie umieścić w libfinal.a?

Edit_1: Aktualizacja pytanie podstawie postępów: The objdump biblioteki składnika libstatic.a (objdump -D libstatic.a) wykazuje .text sekcje oddzielnie dla każdej z funkcji (prawidłowo). Podczas gdy w połączonej bibliotece libfinal.a, która została utworzona przez częściowe połączenie (flaga -r), istnieje tylko jedna sekcja .text. Sądzę, że oznacza to, że nastąpiło wewnętrzne połączenie, a nie tylko tworzenie zwykłego archiwum.

Odpowiedz

1

ld tworzy pliki wykonywalne i biblioteki współużytkowane, a nie archiwa plików obiektowych (pliki .a).

ar tworzy i modyfikuje archiwa plików obiektów.


-r, --relocateable opcja jest przydatna, gdy chcesz, aby rozwiązać pewne (niezakończone) symbole .so i produkować kolejne .so.

+2

Wygląda na to, że do częściowego łączenia można również użyć flagi '-r'. Proszę zobaczyć moje ** Edit_1 ** w pytaniu. Jeśli chodzi o weryfikację, mogę połączyć końcową bibliotekę utworzoną przy użyciu flagi '-r' z moją aplikacją. – govind