Страница 1 из 1
Как заставить GCC убирать при линковке inline-функции?
Добавлено: 05 фев 2010, 14:32
eqltv
Пишу на avr-gcc, очень критичен размер кода, в распоряжении имеется всего 2 килобайта. Использую ключ -Os. Компилятор встраивает многие функции (некоторые из них в коде помечены inline), но из полученного объектного файла не убирает их бесполезные тела, а это лишняя сотня байт! Как ему объяснить, что не нужно оставлять код, который никогда не вызывается? Под объектным файлом я понимаю тот, который получается в итоге, а не промежуточный.
Проблема решена.
Добавлено: 05 фев 2010, 15:46
eqltv
Проблема решена не лучшим способом - файл был переименован в .cpp и всё было обернуто в анонимный нэймспейс. Размер кода сократился в полтора раза.
Re: Как заставить GCC убирать при линковке inline-функции?
Добавлено: 05 фев 2010, 19:07
Romeo
Почему не лучшим способом? Это как раз отличный способ. Всё, что ты хочешь делать, нужно делать явно, используя конструкции языка.
В Unix-подобных системах все имена функций из шареных библиотек по умолчанию являются экспортируемыми. Компилятор не мог выбросить тела по той причине, что кто-то мог залинковать библиотеку снаружи и вызвать эти функции. Как только ты спрятал функции в анонимный неймспейс, они стали невидны не только в экспортной секции, но даже во всех остальных единицах трансляции, потому компилятор без проблем провёл оптимизацию.
Re: Как заставить GCC убирать при линковке inline-функции?
Добавлено: 05 фев 2010, 20:44
eqltv
Не лучшим - потому что был чистый си, а стал с плюсами. Другой язык!
Re: Как заставить GCC убирать при линковке inline-функции?
Добавлено: 06 фев 2010, 13:29
Romeo
Ах, вот в чём проблема

Я просто не думал, что она именно в этом.
В чистом С можно добиться того же эффекта, поставив ключевое слово
static перед объявлением функции.
Re: Как заставить GCC убирать при линковке inline-функции?
Добавлено: 06 фев 2010, 13:41
Romeo
И, кстати, второй способ решить эту проблему на чистом С (ровна как и на С++) - это создать файл, в котором будут перечисляться экспортируемые из либы функции и скормить его компилятору (опцию компилятора навскидку не вспомню). В этом случае все функции, которые там не будут перечислены, будут запрещены для внешней линковки, что так же, как и при использовании static/namespace, позволит провести оптимизацию.
Re: Как заставить GCC убирать при линковке inline-функции?
Добавлено: 06 фев 2010, 22:24
eqltv
Спасибо за совета про static, не знал! Но вот с файлами для компилятора вряд ли, потому что у меня не библиотека, а исполняемый файл (как бы). А он не должен экспортировать ничего на архитектуре AVR.
Re: Как заставить GCC убирать при линковке inline-функции?
Добавлено: 08 фев 2010, 10:57
Romeo
Я думал, что shared library. Если executable, то второй способ отпадает.