|
undefined reference to `_exit', Это уже было... |
|
|
|
Feb 10 2013, 18:48
|

фанат дивана
     
Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684

|
Цитата(ajkpro @ Feb 10 2013, 23:19)  Это я уже понял, что некий деструктор не подхватывается. Но почему у автора и некоторых последователей прошло. Потому что автор и последователи убрали деструкторы. Цитата(ajkpro @ Feb 10 2013, 23:19)  Там рекомендуют sys.c, но его нет по ссылке. Вот вам новая ссылка.
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Feb 11 2013, 17:36
|
Группа: Участник
Сообщений: 10
Регистрация: 10-02-13
Пользователь №: 75 568

|
Цитата(AHTOXA @ Feb 10 2013, 22:48)  Потому что автор и последователи убрали деструкторы. А там некий траслятор это дело игнорирует - тутТем не менее... Цитата(AHTOXA @ Feb 10 2013, 22:48)  как его прикрутить? Пока фантазии не хватает... Вот, то что подчеркнуто это я добавил: cc: $(SRC) $(CC) $(CFLAGS) $(SRC) ./sys.cЕстественно, ничего не вышло: Цитата /home/ajk/stm32/gcc-arm-none-eabi-4_7-2012q4/bin/../lib/gcc/arm-none-eabi/4.7.3/../../../../arm-none-eabi/lib/armv7-m/libc.a(lib_a-exit.o): In function `exit': exit.c:(.text.exit+0x16): undefined reference to `_exit' collect2: error: ld returned 1 exit status make: *** [ldall] Ошибка 1 Но, с другой стороны в его коде и нет деструкторов: _exit Ну, и весь make: CODE BIN=stm32vldiscovery-linux-template
TOOLS_PATH=/home/ajk/stm32/gcc-arm-none-eabi-4_7-2012q4 TOOLS_PREFIX=arm-none-eabi- TOOLS_VERSION=4.7.3
CFLAGS=-c -mcpu=cortex-m3 -mthumb -Wall -O0 -mapcs-frame -D__thumb2__=1 CFLAGS+=-msoft-float -gdwarf-2 -mno-sched-prolog -fno-hosted -mtune=cortex-m3 CFLAGS+=-march=armv7-m -mfix-cortex-m3-ldrd -ffunction-sections -fdata-sections CFLAGS+=-I./cmsis -I./stm32_lib -I. ASFLAGS=-mcpu=cortex-m3 -I./cmsis -I./stm32_lib -gdwarf-2 -gdwarf-2 LDFLAGS=-static -mcpu=cortex-m3 -mthumb -mthumb-interwork -Wl,--start-group LDFLAGS+=-L$(TOOLS_PATH)/lib/gcc/arm-none-eabi/$(TOOLS_VERSION)/thumb2 LDFLAGS+=-L$(TOOLS_PATH)/arm-none-eabi/lib/thumb2 -lc -lg -lstdc++ -lsupc++ -lgcc -lm #LDFLAGS+=--section-start=.text=0x8000000 LDFLAGS+=-Wl,--end-group -Xlinker -Map -Xlinker $(BIN).map -Xlinker LDFLAGS+=-T ./stm32_lib/device_support/gcc/stm32f100rb_flash.ld -o $(BIN).elf
CC=$(TOOLS_PATH)/bin/$(TOOLS_PREFIX)gcc-$(TOOLS_VERSION) AS=$(TOOLS_PATH)/bin/$(TOOLS_PREFIX)as SIZE=$(TOOLS_PATH)/bin/$(TOOLS_PREFIX)size
CMSISSRC=./cmsis/core_cm3.c STM32_LIBSRC=./stm32_lib/system_stm32f10x.c ./stm32_lib/stm32f10x_it.c STM32_LIBSRC+=./stm32_lib/stm32f10x_rcc.c ./stm32_lib/stm32f10x_gpio.c SRC=main.c
OBJ=core_cm3.o system_stm32f10x.o stm32f10x_it.o startup_stm32f10x_md_vl.o OBJ+=stm32f10x_rcc.o stm32f10x_gpio.o OBJ+=main.o
all: ccmsis cstm32_lib cc ldall $(SIZE) -B $(BIN).elf
ccmsis: $(CMSISSRC) $(CC) $(CFLAGS) $(CMSISSRC)
cstm32_lib: $(STM32_LIBSRC) $(CC) $(CFLAGS) $(STM32_LIBSRC) $(AS) $(ASFLAGS) ./stm32_lib/device_support/gcc/startup_stm32f10x_md_vl.S -o startup_stm32f10x_md_vl.o
cc: $(SRC) $(CC) $(CFLAGS) $(SRC) ./sys.c
ldall: $(CC) $(OBJ) $(LDFLAGS)
.PHONY: clean load
clean: rm -f $(OBJ) \ $(BIN).map \ $(BIN).elf make clean -C ./stlink/build/
load: $(BIN).elf ./flashing_stm32vldiscovery.sh $(BIN).elf
Сообщение отредактировал IgorKossak - Feb 11 2013, 19:53
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!!!
|
|
|
|
|
Feb 11 2013, 20:05
|

фанат дивана
     
Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684

|
Цитата(ajkpro @ Feb 11 2013, 23:36)  А там некий траслятор это дело игнорирует - тут"Там" деструкторов сразу не было. Просто более старые версии компилятора подтягивали исключения не только при наличии деструкторов, но и просто при наличии чисто виртуальных функций. sys.c от этого помогал. Но, может быть, у вас вообще другая проблема? Судя по makefile, у вас проект не на c++, а на c, а там нет деструкторов. Может быть, вы просто добавили в main.c вызов функции printf()? Или ещё проще - у вас нет в конце main() бесконечного цикла, и программа завершает работу? (как раз при этом вызывается функция exit() )
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Feb 12 2013, 03:25
|
Группа: Участник
Сообщений: 10
Регистрация: 10-02-13
Пользователь №: 75 568

|
Цитата(AHTOXA @ Feb 12 2013, 00:05)  Но, может быть, у вас вообще другая проблема? Судя по makefile, у вас проект не на c++, а на c, а там нет деструкторов. По какому слову в makefile это видно? Цитата(AHTOXA @ Feb 12 2013, 00:05)  Может быть, вы просто добавили в main.c вызов функции printf()? Или ещё проще - у вас нет в конце main() бесконечного цикла, и программа завершает работу? (как раз при этом вызывается функция exit() ) Я ещё ничего не добавлял, но в двух файлах есть функция printf()~/stm32/stm32vldiscovery-linux-template/ stlink/src/ stlink-hw.c gdb-server.c И цикл там есть. Код while (1) {} А может быть, что в другом новом компиляторе нужны другие ключи для компиляции? Спасибо! Александр.
|
|
|
|
|
Feb 12 2013, 04:35
|

фанат дивана
     
Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684

|
Цитата(ajkpro @ Feb 12 2013, 09:25)  По какому слову в makefile это видно? Ну, там просто нет ни одного *.cpp файла. И компилятор вызывается gcc, а не g++. Цитата(ajkpro @ Feb 12 2013, 09:25)  Я ещё ничего не добавлял, но в двух файлах есть функция printf() ~/stm32/stm32vldiscovery-linux-template/stlink/src/ stlink-hw.c gdb-server.c Не, эти файлы не имеют отношения к вашей программе. Это исходники утилиты stlink, которая применяется для заливки прошивок и отладки. Цитата(ajkpro @ Feb 12 2013, 09:25)  И цикл там есть. Код while (1) {} Цикл должен быть в функции main() в файле main.c. Проверьте это.
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Feb 12 2013, 05:54
|

Местный
  
Группа: Участник
Сообщений: 340
Регистрация: 25-10-05
Из: Пермь, Россия
Пользователь №: 10 091

|
Цитата(AHTOXA @ Feb 12 2013, 01:05)  Может быть, вы просто добавили в main.c вызов функции printf()? Или ещё проще - у вас нет в конце main() бесконечного цикла, и программа завершает работу? (как раз при этом вызывается функция exit() ) Цитата(ajkpro @ Feb 12 2013, 08:25)  А может быть, что в другом новом компиляторе нужны другие ключи для компиляции? Может быть лучше не гадать, а просто посмотреть в map-файл и узнать, кто вызвал exit()?..
--------------------
Всего наилучшего, Alex Mogilnikov
|
|
|
|
|
Feb 12 2013, 17:43
|
Группа: Участник
Сообщений: 10
Регистрация: 10-02-13
Пользователь №: 75 568

|
Вот, main.c: Код #include "stm32f10x.h"
void RCC_init() { RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); }
int main(void) { GPIO_InitTypeDef GPIOC_init_params;
RCC_init();
GPIOC_init_params.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9; GPIOC_init_params.GPIO_Speed = GPIO_Speed_10MHz; GPIOC_init_params.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOC, &GPIOC_init_params);
GPIO_SetBits(GPIOC, GPIO_Pin_8); GPIO_SetBits(GPIOC, GPIO_Pin_9);
while (1) {} } Т.е. цикл есть. Цитата(alx2 @ Feb 12 2013, 09:54)  Может быть лучше не гадать, а просто посмотреть в map-файл и узнать, кто вызвал exit()?.. Увы, я в нем ничего не понял... Но чистого exit() там нет.
|
|
|
|
|
Feb 13 2013, 03:49
|
Группа: Участник
Сообщений: 10
Регистрация: 10-02-13
Пользователь №: 75 568

|
Вот, map файл: http://yadi.sk/d/po6sankd2_2yQ
Сообщение отредактировал ajkpro - Feb 13 2013, 03:50
|
|
|
|
|
Feb 13 2013, 16:39
|
Группа: Участник
Сообщений: 10
Регистрация: 10-02-13
Пользователь №: 75 568

|
Цитата(xemul @ Feb 13 2013, 13:15)  Код void main(void) { ... while (1) {} } ? Ну, цикл-то есть. И им заканчивается программа. Там просто пример. Зажигаются по очереди по таймеру две лампочки.
|
|
|
|
|
Feb 13 2013, 18:42
|
Группа: Участник
Сообщений: 10
Регистрация: 10-02-13
Пользователь №: 75 568

|
Цитата(xemul @ Feb 13 2013, 21:54)  Может таки в .map заглянете? Там чёрным по-английски резервируется место под int, возвращаемый main(), и подтягивается функция, его возвращающая. Угадаете с трёх раз её имя? Да, я то не против. Только я первый раз смотрю. Нифига ни вижу. А, допустим, увижу. Что дальше? У автора так работает. Почему на этом компиляторе так не катит? И как sys. срабатывает? Александр.
|
|
|
|
|
Feb 14 2013, 05:44
|

Местный
  
Группа: Участник
Сообщений: 340
Регистрация: 25-10-05
Из: Пермь, Россия
Пользователь №: 10 091

|
Цитата(ajkpro @ Feb 12 2013, 22:43)  Увы, я в нем ничего не понял... Но чистого exit() там нет. То есть линкер говорит: "In function `exit':", а в map-файле об этом самом exit ничего не пишет??? А это тогда что: Код /home/ajk/stm32/gcc-arm-none-eabi-4_7-2012q4/bin/../lib/gcc/arm-none-eabi/4.7.3/../../../../arm-none-eabi/lib/armv7-m/libc.a(lib_a-exit.o) /home/ajk/stm32/gcc-arm-none-eabi-4_7-2012q4/bin/../lib/gcc/arm-none-eabi/4.7.3/../../../../arm-none-eabi/lib/armv7-m/crt0.o (exit) ? Эта запись означает, что линкер загрузил lib_a-exit.o из libc.a для того чтобы удовлетворить ссылку на символ exit, имеющуюся в crt0.o. Цитата(ajkpro @ Feb 13 2013, 23:42)  А, допустим, увижу. Что дальше? А дальше Вы будете разбираться, почему в Вашем crt0.o есть ссылка на exit, которой, как Вы считаете, там быть не должно...
Сообщение отредактировал alx2 - Feb 14 2013, 06:09
--------------------
Всего наилучшего, Alex Mogilnikov
|
|
|
|
|
Feb 14 2013, 14:58
|

фанат дивана
     
Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684

|
Цитата(ajkpro @ Feb 13 2013, 09:49)  Короче, дело в следующем. 1. sys.c - забудьте про него, это совсем из другой оперы. 2. В вашем проекте почему-то вместо файла stm32_lib/device_support/gcc/startup_stm32f10x_md_vl.S используется файл начальной инициализации, предоставляемый компилятором по умолчанию. И он зачем-то вызывает _exit(). Это может быть действительно глюк компилятора. 3. Если вас это устраивает, просто добавьте в файл main.c функцию Код void _exit(int i) { while (1); } А вообще, тот шаблон, который вы себе выбрали для старта - не очень удачный. Видите, сколько возни для того, чтобы просто скомпилировать его. Лучше возьмите другой шаблон, где всё сразу сделано нормально. Например, вот отсюда.
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|