1

Я скомпилировал одну утилиту и создал бинарный файл в моей системе Linux. Но размер этого двоичного файла составляет 2,3 МБ, и мне нужно уменьшить размер этого двоичного файла. Я попытался применить STRIP для двоичного файла, но его недостаточно. Так есть ли какая-либо опция (возможно, конфигурация), которую я могу применить при компиляции утилиты?

Заранее спасибо за ваш ответ.

2 ответа2

3

Вы можете использовать флаг -os, если вы используете GCC для компиляции. Вы можете найти его здесь на странице флагов GCC -

-Os
    Optimize for size. -Os enables all -O2 optimizations that do not typically increase code size. It also performs further optimizations designed to reduce code size.

    -Os disables the following optimization flags:

              -falign-functions  -falign-jumps  -falign-loops 
              -falign-labels  -freorder-blocks  -freorder-blocks-and-partition 
              -fprefetch-loop-arrays

Если вы по каким-то причинам должны иметь эти флаги, ну, это не для вас. Кроме того, вы ставите под угрозу производительность для размера

Вы также можете использовать различные методы сжатия исполняемых файлов, такие как upx, post- compile, чтобы уменьшить размер исполняемого файла. Это также компромисс между производительностью и размером (хотя и довольно минимальный), но его можно использовать поверх любой оптимизации, которую вы выберете. Уменьшение размера здесь может быть довольно существенным.

1

Вы можете использовать следующие методы для уменьшения размера исполняемого файла:

  • Убедитесь, что исполняемый файл скомпилирован без отладочных символов. Это произойдет, если ваш make-файл имеет флаг -g присутствующий в опциях командной строки gcc . Обычно это значение по умолчанию, поскольку оно позволяет легко отлаживать такой исполняемый файл. Вы можете использовать служебную strip для удаления отладочных символов из существующего исполняемого файла. Очень часто это само по себе может уменьшить размер исполняемого файла в 2 или более раз, иногда до 10 раз.
  • Динамически скомпилируйте все необходимые библиотеки (особенно библиотеку времени выполнения C glibc в Linux). Статическая компиляция (-s) хороша, чтобы избежать зависимостей, но это достигается ценой значительного увеличения размера исполняемого файла. Например, если вашему исполняемому файлу требуется libxml2, добавьте -lxml2 в командную строку gcc чтобы динамически связать libxml2 . Недостатком этого подхода является то, что ваш исполняемый файл аварийно завершит работу, если необходимая библиотека не будет установлена в вашей целевой системе (вы должны сначала запустить sudo apt-get install libxml2).
  • Включить оптимизацию по размеру -Os . Тем не менее, типичные выгоды очень малы, редко превышают 5-10%.
  • Сожмите исполняемый файл с помощью upx (установите его с помощью sudo apt-get install upx-ucl). upx поддерживает упаковку не только для платформы Intel, но и для многих других платформ, таких как arm, mips, powerpc и т. д. Обратите внимание, что хотя upx может дать впечатляющее уменьшение в размере (2x-5x), его не следует использовать вслепую. В отличие от стандартных исполняемых файлов, сжатые с помощью upx не могут использовать одни и те же страницы кэша. Например, если ваша программа имеет размер 2 МБ и вы запускаете 100 ее копий, она будет занимать только около 2 МБ памяти - ядро будет повторно использовать кэшированные страницы. Если вы сожмете его с помощью upx скажем, 1 МБ и запустите 100 копий, он будет использовать 200 МБ памяти. Тем не менее, потребуется только чтение 1 МБ с диска, и это значительно сократит время запуска первой копии, потому что распаковка с очень upx быстродействием (намного быстрее, чем чтение с диска).

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .