2010-07-19 16 views
21

Próbuję skompilować plik wykonywalny (plik ELF), który nie korzysta z dynamicznego programu ładującego. Zbudowałem krzyżowy kompilator, który kompiluje mipsy z Linuxa do użycia na symulatorze, który zrobiłem. Podałem flagę -static-libgcc w kompilacji mojego pliku hello.cpp (hello world program). Najwyraźniej to jednak nie wystarczy. Ponieważ w moim pliku wykonywalnym nadal znajduje się segment zawierający nazwę/ścieżkę dynamicznego programu ładującego. Jakich flag używam do generowania pliku wykonywalnego, który zawiera WSZYSTKO potrzebne do uruchomienia? Czy muszę odbudować mój kompilator krzyżowy?Skompiluj samodzielny statyczny plik wykonywalny

Odpowiedz

12

Spróbuj użyć flagi -static?

+0

Czy istnieje dobry opis zasobu dokładny wynik każdej z flag gcc? Nie jestem w 100% pewien, czy wyłączam dynamiczne ładowanie, czy nie. Kiedy używam -static nadal mam nazwę dynamicznego programu ładującego umieszczonego w mojej sekcji .interp pliku elf. –

+0

http://gcc.gnu.org/onlinedocs/gcc/Option-Index.html Kiedyś pisałem system operacyjny, który ładuje pliki wykonywalne elfa i mogę potwierdzić, że flaga -statyczna flaga działa, po prostu zignoruj ​​rzeczy związane z LD i przeskocz bezpośrednio do punktu wejścia do pliku wykonywalnego – Tomaka17

+0

Przeczytałem coś o użyciu opcji konfiguracyjnej "-disable-shared". Czy nie jest to konieczne, aby skompilować samodzielny plik wykonywalny? –

61

Użyj następujących flagi do łączenia

-static -static-libgcc -static-libstdc++ 

Te trzy flagi połączyć przeciwko statycznych wersji wszystkich zależnościach (GCC założeniu). Zauważ, że w niektórych sytuacjach niekoniecznie potrzebujesz wszystkich trzech flag, ale one też nie "ranią". Dlatego po prostu włącz wszystkie trzy.

Sprawdź, czy to faktycznie przepracowanych

  1. Upewnij się, że naprawdę nie ma dynamiczny podnośnik

    ldd yourexecutable 
    

    powinien wrócić „Nie dynamiczny wykonywalny” lub coś równoważne.

  2. Upewnij się, że nie istnieją nierozwiązane symbole lewej

    nm yourexecutable | grep " U " 
    

    lista powinna być pusta lub może zawierać tylko niektóre symbole specjalne kernel-space jak

    U __tls_get_addr 
    
  3. Na koniec sprawdź, czy może faktycznie wykonać swój plik wykonywalny

+2

To powinna być zaakceptowana odpowiedź! –

Powiązane problemy