2016-05-17 15 views
5

Zastanawiasz się, czy opcje łącznika gcc (np .: -Wl, opcje) mogą zmieniać instrukcje asemblera w skompilowanym pliku wykonywalnym, jak to się dzieje, gdy używasz pewnych opcji optymalizacji gcc? Czy różnica między korzystaniem z opcji linkera a jej niewykorzystywaniem może być widoczna podczas porównywania skompilowanych plików binarnych (np. Porównywania sygnatur)?Czy opcje łącznika gcc mogą zmienić instrukcje asemblera w skompilowanym pliku binarnym?

UPDATE

Aby być bardziej precyzyjnym Chcę dowiedzieć się, czy FLIRT podpisy zmienić podczas korzystania z niektórych opcji łączące podczas procesu kompilacji. Te podpisy wykorzystują tylko funkcje biblioteczne do tworzenia podpisów.

+1

Zobacz np. '--wrap'. – Phillip

+0

@ Phillip, czy możesz wyjaśnić to dokładniej? – Maximilian

+0

Strona podręcznika zawiera szczegóły dotyczące opcji; może być użyty do przesłonięcia symboli, które, przynajmniej dla plików obiektów C, mogą również zmienić sygnaturę funkcji. – Phillip

Odpowiedz

4

Dla niektórych opcji linkera, zmiany można zaobserwować w wytworzonym binarny, na przykład:

  • Options, aby pozbyć się/utrzymanie symboli debugowania (--strip-all, --strip-debug, --discard-all)
  • Opcje, aby pozbyć/zachować nieużywane sekcje, np sekcja zawierająca funkcję, która nigdy nie jest przywoływana w innych sekcjach. Te sekcje można łatwo usunąć. Lub zachować sekcje/treści relokacji. (--as-needed, --emit-relocs)
  • Opcje zawierać jeden statyczny biblioteki lub innego kompatybilnego jedną (na przykład biblioteki wersji x.0 w obsarze vs wersja x.1)
  • Kolejność obiektów i biblioteki statyczne są wprowadzane w wierszu poleceń. Na przykład ld -o foo a.obj b.obj c.obj i ld -o foo a.obj c.obj b.obj będzie prawdopodobnie produkuje inny plik binarny, jeśli wywołanie od a do funkcji w c zostanie rozwiązane (przesunięcie dla kodu z c.obj, a tym samym adres funkcji w c będzie prawdopodobnie być różne)

Ale nawet po połączeniu, podpis binarny może się zmienić. Na przykład w Linuksie, gdy optymalizujesz binarny czas uruchamiania, uruchamiając prelink

+0

faktycznie interesują mnie tylko zmiany w binarnym poziomie funkcji. Jeśli zostaną zmodyfikowane specjalne symbole debugowania, nie spowoduje to zmiany kodu zestawu funkcji. Czy możesz sobie wyobrazić scenariusz, w którym kod zespołu na podstawie funkcji zmienia się za pomocą opcji linkera? – Maximilian

+3

Tak, połączenia z innymi obiektami mogą zostać przekształcone w różne przesunięcia/adresy w zależności od ich kolejności lub kolejności w statycznych bibliotekach lub w różnych wersjach biblioteki. – Elijan9

+0

, ale funkcje w bibliotece statycznej pozostaną nietknięte, prawda? – Maximilian

1

Tak, zobaczysz inną sumę kontrolną na dwóch plikach binarnych połączonych różnymi opcjami linkera - chyba że opcja nie przyniosła żadnego efektu, na przykład po określeniu wartości domyślnej opcja lub opcja, która nie zmienia pliku binarnego (-print-map).

Co próbujesz dokładnie określić? Wygląda na to, że masz problemy podczas określania pewnych opcji łącznika i próbujesz dowiedzieć się, dlaczego. Powiedz nam więcej, a może lepiej udzielimy pomocy.

+0

patrz aktualizacja powyżej – Maximilian

Powiązane problemy