Скомпилируйте автономный статический исполняемый файл - PullRequest
32 голосов
/ 19 июля 2010

Я пытаюсь скомпилировать исполняемый файл (файл ELF), который не использует динамический загрузчик. Я создал кросс-компилятор, который компилирует mips из linux для использования на симуляторе, который я сделал. Я установил флаг -static-libgcc при компиляции моего файла hello.cpp (программа hello world). Видимо, этого недостаточно. Потому что в моем исполняемом файле все еще есть сегмент, который содержит имя / путь динамического загрузчика. Какие флаги я использую для генерации исполняемого файла, который содержит ВСЕ, что нужно для запуска? Нужно ли перестраивать мой кросс-компилятор?

Ответы [ 2 ]

90 голосов
/ 18 марта 2013

Используйте следующие флаги для связи

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

Используйте эти три флага для связи со статическими версиями всех зависимостей (при условии, что gcc).Обратите внимание, что в определенных ситуациях вам необязательно нужны все три флага, но они также не «повреждают».Поэтому просто включите все три.

Проверьте, действительно ли это сработало

  1. Убедитесь, что динамическая связь действительно отсутствует

    ldd yourexecutable
    

    должен возвращать "не динамический исполняемый файл" иличто-то эквивалентное.

  2. Убедитесь, что не осталось неразрешенных символов

    nm yourexecutable | grep " U "
    

    Список должен быть пустым или содержать только некоторые специальные символы пространства ядра, такие как

    U __tls_get_addr
    
  3. Наконец, проверьте, действительно ли вы можете выполнить свой исполняемый файл

20 голосов
/ 19 июля 2010

Попробуйте использовать флаг -static?

...