реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> GCC: линковка только нужных функций из собственных библиотек - решено
AlexeyVoroshen
сообщение Oct 6 2012, 21:56
Сообщение #1





Группа: Участник
Сообщений: 12
Регистрация: 19-08-10
Пользователь №: 59 015



Здравствуйте все.

Нашёл одну проблему при работе с GCC (yagarto(1206), kgp-arm-eabi_x86-32_20120427):
Мои проекты доросли до такого размера, когда уже хочется использовать собственные библиотеки.
Вот я и решил собрать STM32F4xx_StdPeriph_Driver как библиотеку libSTM32F4xx_StdPeriph_Driver.a.

Собирается хорошо. Работает. НО! Линкер тянет все функции из используемого obj файла в библиотете.

----------------------------------------------------------------------------
Библиотеку собираю так:

C_SOURCE = \
$(STDLIB_SRC_DIR)/src/misc.c \
$(STDLIB_SRC_DIR)/src/STM32F4xx_gpio.c \
$(STDLIB_SRC_DIR)/src/STM32F4xx_rcc.c \
.....

ALLFLAGS += \
-mthumb -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard \
-Wall \
-ggdb \
-Os \
-MD -MP -MF $(OUTDIR)/.dep/$(@F).d \
-I inc \
-I . \
-I ./../CMSIS/Include \

AR_FLAGS = rcs $(PROJECT).a

-----------------------------------------------------------------
А программу так:

ALLFLAGS += \
-mthumb -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard \
-Wall \
-ggdb \
-Os \
-MD -MP -MF $(OUTDIR)/.dep/$(@F).d \
-I inc \
-I . \
-I ./../CMSIS/Include \
.....

ALLFLAGS += -ffunction-sections -fdata-sections -Wl,--gc-sections

LINKER_FLAGS = -nostartfiles -Xlinker -o$(ELFDIR)/$(PROJECT).elf -Xlinker -M -Xlinker -Map=$(OUTDIR)/$(PROJECT).map

>>>>>>>> 1) LINKER_FLAGS += $(STDLIB_SRC_DIR)/libSTM32F4xx_StdPeriph_Driver.a
>>>>>>>> 2) C_SOURCE += $(STDLIB_SRC_DIR)/src/stm32f4xx_gpio.c

-----------------------------------------------------------------
Сама программа простейшая:

int main( void )
{
while( 1 ) {
GPIO_WriteBit( GPIOB, GPIO_Pin_4, Bit_SET );
GPIO_WriteBit( GPIOB, GPIO_Pin_4, Bit_RESET );
}
}

И получаю два варианта:
1) Используется libSTM32F4xx_StdPeriph_Driver.a
text data bss dec hex filename
2152 16 256 2424 978 ./Control4.elf

2) Используется C_SOURCE += $(STDLIB_SRC_DIR)/src/stm32f4xx_gpio.c
text data bss dec hex filename
536 0 256 792 318 ./Control4.elf

в map файле видно, что при подключении библиотеки тянутся все ненужные (в данном примере) функции
GPIO_Init, GPIO_ReadOutputDataBit и т.д.


Что я делаю не так??? Подскажите пожалуйста.


P.S. Про флаг -flto я знаю. С ним оптимизируется всё хорошо. Но мне надо что-бы работало и отлаживалось без него.

Сообщение отредактировал AlexeyVoroshen - Oct 7 2012, 19:47
Go to the top of the page
 
+Quote Post
ReAl
сообщение Oct 7 2012, 06:03
Сообщение #2


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



При компиляции библиотеки ведь нет
Код
-ffunction-sections -fdata-sections
вот оно весь obj одним куском .text и тянет.
Это по map видно должно быть.
Кроме того,
Код
ALLFLAGS += -ffunction-sections -fdata-sections -Wl,--gc-sections
выглядит несколько непонятно. *-section это флаги компилятора, а --gc-sections линкера.

Так что
Код
CFLAGS   += -ffunction-sections -fdata-sections
CXXFLAGS += -ffunction-sections -fdata-sections
LDFLAGS  += -Wl,--gc-sections


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
SyncLair
сообщение Oct 7 2012, 14:48
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 209
Регистрация: 6-01-12
Пользователь №: 69 197



Как раз при использовании библиотек у меня всегда была оптимизация в смысле выкидывания ненужных функци даже без всяких gc-sections, а вот при сборке скопом не всегда. Даже пришлось повозится с тем, что выкидываются обработчики прерываний из библиотек.
Меня ваш случай удивляет, если честно.

Я использую CMAKE для генерации Makefile-ов. Однако и самописные Makefail-ы были правда для AVR только.

Сообщение отредактировал SyncLair - Oct 7 2012, 14:49


--------------------
Go to the top of the page
 
+Quote Post
mdmitry
сообщение Oct 7 2012, 15:35
Сообщение #4


Начинающий профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 25-10-06
Из: СПб
Пользователь №: 21 648



Цитата(AlexeyVoroshen @ Oct 7 2012, 01:56) *
...
НО! Линкер тянет все функции из используемого obj файла в библиотете.
...


Попробуйте разместить каждую функцию библиотеки в отдельный файл.
Похожая ситуация была у меня для контроллера intel196, но компилятор был не GNU. В руководстве библиотекаря было маленькое замечание о стиле: каждая функция библиотеки в отдельный исходный файл. Кажется, так было и с версией TurboC 2.0.
На этой идее строятся библиотеки IAR.


--------------------
Наука изощряет ум; ученье вострит память. Козьма Прутков
Go to the top of the page
 
+Quote Post
AlexeyVoroshen
сообщение Oct 7 2012, 19:45
Сообщение #5





Группа: Участник
Сообщений: 12
Регистрация: 19-08-10
Пользователь №: 59 015



Цитата(ReAl @ Oct 7 2012, 09:03) *
При компиляции библиотеки ведь нет
Код
-ffunction-sections -fdata-sections
вот оно весь obj одним куском .text и тянет.
Это по map видно должно быть.
Кроме того,
Код
ALLFLAGS += -ffunction-sections -fdata-sections -Wl,--gc-sections
выглядит несколько непонятно. *-section это флаги компилятора, а --gc-sections линкера.

Так что
Код
CFLAGS   += -ffunction-sections -fdata-sections
CXXFLAGS += -ffunction-sections -fdata-sections
LDFLAGS  += -Wl,--gc-sections


Спасибо! Именно это я и упустил из виду.
Сейчас проверил на нескольких библиотеках для пары проектов - всё оптимизируется как надо.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th June 2025 - 02:29
Рейтинг@Mail.ru


Страница сгенерированна за 0.01394 секунд с 7
ELECTRONIX ©2004-2016