• Windows GCC Haskell C binutils *пиздец Натолкнулся на доставляющую фичу бинутилза под PE/COFF. Что GCC, что GHC вставляют что-то типа .ident "Compiler Version" в генерируемые ассемблерные файлы. Для GCC это отключается по -fno-ident, для GHC — хрен знает.
    Под ELF никаких проблем: создаётся секция .comment в объектнике, которая: а) не гузится в память; б) с флагом MERGE (дубли схлопываются при линковке). Т.е. в результате в исходном бинарнике получается секция с «подписями» всех компиляторов, когда-либо участвовавших в его создании. Удобно.
    Для PE/COFF... Ну, вы поняли... В объектнике создаётся секция .rdata$zzz, которая мало того с флагами ALLOC и LOAD, так ещё дефолтный линк-скрипт аппендит её к .rdata бинарника. В результате, мусор в конце секции .rdata.
    И если в 7.10.2 он занимал небольшое количество относительно размера бинарника, то в 7.10.3 со сменой тулчейна ситуация значительно ухудшилась.
    Решение:
    1. Подвергнуть живительному экстерминатусу секцию .rdata$zzz во всех объекниках и статических библиотеках strip --strip-unneeded --keep-file-symbols -R .rdata$zzz сделает своё дело. Увы, strip обламывается на HsBase из-за громадного размера, поэтому придётся вручную упаковывать/распаковывать.
    2. Добавить строчку в линк-скрипт (перед .rdata) DISCARD : {*(rdata$zzz)}
    Увы, хрен его знает как это сделать в GHC.
    Гугл молчит, так что прошу распространить.
    А вообще, эта «фича», мне кажется, может смело номинироваться на премию «Просос года». Даже боязно смотреть как обстоят дела с «официальными» сборками опенсорса под венду.
    ♡ recommended by @Renha

Replies (9)

  • @Macil, Отрепортить Сене Марлову, или кто у них там главный?
  • @alar, Дык, не вижу смысла. Это не глюк. Это такое поведение бинутилзов, которое останется навсегда (юзерспейс мы не ломаем). В крайнем случае речь может идти о небольшой оптимизации билд-системы под венду.
    А вот детально проанализировать причины, и выработать правильные меры (шапкозакидательство типа strip или DISCARD неприменимо для серьёзных проектов) с детальным отражением в документации — необходимо.
  • @Macil, Понял как передавать опции ld. Поскольку линкер — gcc, то нужно изварщаться ghc -optl="-Wl,-dT<полный путь к скрипту>". На стрипнутом хелловорде на Х-е получил разницу в 11 килобайт.
  • @Macil, 11 из скольки? Что отрезал?
  • @alar, Линк-скрипт с секцией DISCARD : {*(.rdata$zzz)} и без. Размер 1113к и 1124к соответственно.
  • @Macil, Печёшься о размере бинарника, когда у всех жёсткие диски в несколько терабайт?
  • @mabu, а утюги х-ь зохватывать не собирается?
  • @mabu, Увы, этот мусор грузится в память, что отнимает место у дискового кеша. А ещё левые секции в статических либах — больше памяти на линковку. И если в C/C++ на это слегка посрать, то в в Х-е всё линкуется статически. Для всяких CI-систем, ИМХО, важно.
  • @Macil, Бля-я-я-я... 99-й год, Карл! sourceware.org