Подтвердить что ты не робот

Уменьшить размер исполняемого файла, созданного GHC

Используя GHC версии 7.4.2 с флагами, такими как -O3, я по-прежнему получаю огромный исполняемый файл. Я понимаю, что GHC делает статическое связывание, а зависимости двоичного файла выглядят следующим образом:

    linux-vdso.so.1 (0x00007fff49bff000)
    libpcre.so.1 => /usr/lib/libpcre.so.1 (0x00007fe658d6c000)
    librt.so.1 => /usr/lib/librt.so.1 (0x00007fe658b64000)
    libutil.so.1 => /usr/lib/libutil.so.1 (0x00007fe658961000)
    libdl.so.2 => /usr/lib/libdl.so.2 (0x00007fe65875d000)
    libpthread.so.0 => /usr/lib/libpthread.so.0 (0x00007fe658541000)
    libcurl.so.4 => /usr/lib/libcurl.so.4 (0x00007fe6582e3000)
    libgmp.so.10 => /usr/lib/libgmp.so.10 (0x00007fe658074000)
    libm.so.6 => /usr/lib/libm.so.6 (0x00007fe657d7a000)
    libgcc_s.so.1 => /usr/lib/libgcc_s.so.1 (0x00007fe657b65000)
    libc.so.6 => /usr/lib/libc.so.6 (0x00007fe6577be000)
    /lib/ld-linux-x86-64.so.2 (0x00007fe658fca000)
    libssh2.so.1 => /usr/lib/libssh2.so.1 (0x00007fe657595000)
    libssl.so.1.0.0 => /usr/lib/libssl.so.1.0.0 (0x00007fe65732b000)
    libcrypto.so.1.0.0 => /usr/lib/libcrypto.so.1.0.0 (0x00007fe656f22000)
    libz.so.1 => /usr/lib/libz.so.1 (0x00007fe656d0c000

пока это выглядит неплохо, однако внутри двоичного файла я вижу строки:

GHCi runtime linker: fatal error: I found a duplicate definition for symbol
* Specifying the same object file twice on the GHCi command line 

  ....BlockedIndefinitelyOnMVar.......BlockedIndefinitelyOnSTM........AsyncException..base....GHC.IO.FD.......FD......GHC.IO.FD.setSize.

и на самом деле много текстовых строк, включая имена моих функций, функции, определенные в других модулях и т.д. Вопрос в том, можно ли удалить эти тексты и может ли GHC исключить неиспользуемый код из внешних библиотек?

4b9b3361

Ответ 1

LLVM может выполнять большую оптимизацию во время соединения, чем большинство других компиляторов. Возможно, GHC имеет бэкэнд LLVM, и вы можете перекомпилировать и связать некоторые/все ваши зависимости с -O4.

Ответ 2

Если вы используете сервер gcc, вы можете передать флаг -optc-Os на ghc, чтобы оптимизировать вывод для размера. Возможно, вы можете уменьшить свой бинарный файл на несколько байтов. Но я бы также предложил использовать динамическую компоновку, как было предложено ранее, со всеми преимуществами и недостатками.

UPDATE:

Сжатие исполняемого файла с помощью UPX http://en.wikipedia.org/wiki/UPX или gzexe для уменьшения размера исполняемого файла.