2010-04-09 20 views
9

Z jakiegoś powodu chcę rozpakować statyczną bibliotekę (libx.a) do pojedynczych plików obiektów (ao bo co) i określić te pliki obiektów (ao bo co) w łączu wejściowym lista zamiast biblioteki libx.a, przy pozostałych opcjach linkera pozostających bez zmian.link z biblioteką statyczną a poszczególnymi plikami obiektowymi

Jednak zauważyłem, że powyższa zmiana spowodowała znaczną różnicę w pliku wykonywalnym wyjścia. Zasadniczo metoda (a.o b.o c.o) spowoduje większy rozmiar wyjściowy.

Jaka jest różnica między tymi dwoma metodami (libx.a i poszczególne pliki obiektów)? A czy jest jakiś sposób obejścia?

binutil GNU (za ar i ld) wersja używam jest 2.16.1

Dzięki.

+0

Co to jest, co próbujesz osiągnąć, dzieląc poszczególne pliki obiektów? –

+0

Pierwotnym powodem było to, że chciałem określić sekcję wyjściową dla statycznej biblioteki lib w skrypcie linkera. I z jakiegoś powodu składnia archiwum (libx.a: *. O (.text)) nie działa, prawdopodobnie ze względu na nieaktualną wersję binutil w moim łańcuchu narzędzi. Ponieważ nie mogłem uaktualnić łańcucha narzędzi, musiałem rozpakować bibliotekę i użyć explicite plików obiektów. I tak natknąłem się na ten problem. – user313031

Odpowiedz

10

Ld usuwa nieużywane części połączonych archiwów .lib (jak zmienne z globalnym powiązaniem). Ta optymalizacja nie może mieć miejsca, gdy pliki obiektów są przekazywane bezpośrednio, ponieważ linker nie może ustalić, czy jakiś niepowiązany element pliku .o jest potrzebny jakiejś nieznanej części później (na przykład, ponieważ byłby widoczny przez listę eksportu modułu) lub można całkowicie usunąć. Po wstawieniu .lib w procesie łączenia linker wie na pewno, że może zrzucić niepotrzebne elementy.

+0

Nie wątpię, że to, co mówisz, jest prawdą, ale musi to być q szczególnie dziwactwo. O ile widzę, tak długo, jak jesteś na ostatnim etapie łączenia, ld powinien być w stanie wykonać takie same usuwanie pustego kodu z plikami .o tak jak z plikiem .a. –

+0

Różnica między plikami .lib i .o polega na tym, że ld traktuje nieprzypisane pliki .o w plikach .lib jako odrzucające, podczas gdy każde pliki .o są dołączane do danych wyjściowych. Dzieje się tak dlatego, że istnieją specjalne symbole (na przykład konstruktory C++), które są zgrupowane w specjalne sekcje przez ld (nawet wtedy, gdy są bez odwołań), aby wykonywać specjalne funkcje. Istnieje również przełącznik (--wholes-archive) do utworzenia instancji każdego nieocenionego pliku .o z plików .lib, ale nie wiem, czy istnieje przełącznik, który usuwa niepotrzebne pliki .o. – Rudi

+0

Dziękuję wszystkim. Dobrze to wiedzieć. Ale czy to oznacza, że ​​jeśli zawsze łączę pliki pojedynczych obiektów w statyczną bibliotekę przed połączeniem końcowego pliku wykonywalnego, mogę uzyskać mniejszą wartość wyjściową (jeśli istnieje kod/dane bez odwołań)? A jeśli to prawda, może to być użyteczna technika (brzmi to wbrew intuicji). I wróć do mojego pierwotnego problemu (nie można określić wyjściowego seciton dla statycznych bibliotek w skrypcie linkera), czy istnieje sposób obejścia tego problemu? Dzięki. – user313031

Powiązane problemy