Сабж обладает целым набором удивительных свойств, включая но не ограничиваясь:
- медленная компиляция, сравнимая по скорости с рендерингом 3D Max на старых компах,
- полное отсутствие оптимизаций типа: удаление неиспользуемых ф-ций, инлайн редко используемых ф-ций, игнор пустых ф-ций и тд.,
- передача абсолютно всех входных аргументов в ф-цию через стек, независимо от их количества, вместо передачи через регистры,
- уебищный инлайн асм: отсутствие локальных меток, странный синтаксис и тд.,
- неумение последовательно располагать в памяти код секций, заданных по одному адресу - так и хуйнет их по тому же адресу поверх друг друга,
- просто куча багов и странностей.
Кейзы типа
- Code: Select all
void foo() {}
...
foo();
...
компилятся в
- Code: Select all
foo: ret
...
call foo
...
Стартап код crt0.s линкуется крайне удивительным образом, если делать это при помощи опции --no-std-crt0. В этом случае часть либных ф-ций попадает не в секцию CODE, а в некий небанкуемый HOME, который вообще находится по другому адресу, который (см.выше) нельзя расположить последовательно с CODE. Решение, которое я нашел - не использовать --no-std-crt0, а вместо этого запихнуть свой стартап вместо штатного мясом наружу в папку с компилятором. Тогда ВНЕЗАПНО все секции располагаются в памяти последовательно. Странные люди...
По поводу выкидывания dead code я аж обратился в сапорт.
Весь код, который находится в компилируемом сорце попадает в бинарь безоговорочно.
Весь код, который находится в линкуемом модуле .rel попадает в бинарь безоговорочно.
Весь код, который находится в либе .lib в одном модуле (попавшем в либу из одного .rel) попадает в бинарь безоговорочно.
И только если нафаршировать либу таким образом, чтоб каждая ф-ция лежала в отдельном модуле, повидимому искомый результат будет получен.
БОЛЬНЫЕ УБЛЮДКИ!!!