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

 
 
> undefined reference to `_exit', Это уже было...
ajkpro
сообщение Feb 10 2013, 17:19
Сообщение #1





Группа: Участник
Сообщений: 10
Регистрация: 10-02-13
Пользователь №: 75 568



Это уже былоhttp://electronix.ru/forum/index.php?showtopic=99348, но там я не "дошел".
Это мой первый опыт, поэтому задаю еще раз.
Вот есть проект https://github.com/h0rr0rrdrag0n/stm32vldis...-linux-template
Вот, автор с описанием этого проекта: http://h0rr0rr-drag0n.blogspot.ru/2011/08/...inux-linux.html

Вот, такая ошибка:
Цитата
rmv7-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


Это я уже понял, что некий деструктор не подхватывается. Но почему у автора и некоторых последователей прошло. Там рекомендуют sys.c, но его нет по ссылке. И другой компилятор сам устраняет проблему.
Как все-таки победить?

Спасибо! Александр.
Go to the top of the page
 
+Quote Post
2 страниц V   1 2 >  
Start new topic
Ответов (1 - 14)
AHTOXA
сообщение Feb 10 2013, 18:48
Сообщение #2


фанат дивана
******

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



Цитата(ajkpro @ Feb 10 2013, 23:19) *
Это я уже понял, что некий деструктор не подхватывается. Но почему у автора и некоторых последователей прошло.

Потому что автор и последователи убрали деструкторы.
Цитата(ajkpro @ Feb 10 2013, 23:19) *
Там рекомендуют sys.c, но его нет по ссылке.

Вот вам новая ссылка.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
ajkpro
сообщение Feb 11 2013, 17:36
Сообщение #3





Группа: Участник
Сообщений: 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] - для короткого!!!
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Feb 11 2013, 20:05
Сообщение #4


фанат дивана
******

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



Цитата(ajkpro @ Feb 11 2013, 23:36) *
А там некий траслятор это дело игнорирует - тут

"Там" деструкторов сразу не было. Просто более старые версии компилятора подтягивали исключения не только при наличии деструкторов, но и просто при наличии чисто виртуальных функций. sys.c от этого помогал.
Но, может быть, у вас вообще другая проблема? Судя по makefile, у вас проект не на c++, а на c, а там нет деструкторов.
Может быть, вы просто добавили в main.c вызов функции printf()?
Или ещё проще - у вас нет в конце main() бесконечного цикла, и программа завершает работу? (как раз при этом вызывается функция exit() )


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
ajkpro
сообщение Feb 12 2013, 03:25
Сообщение #5





Группа: Участник
Сообщений: 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) {}


А может быть, что в другом новом компиляторе нужны другие ключи для компиляции?

Спасибо! Александр.
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Feb 12 2013, 04:35
Сообщение #6


фанат дивана
******

Группа: Свой
Сообщений: 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. Проверьте это.



--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
alx2
сообщение Feb 12 2013, 05:54
Сообщение #7


Местный
***

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
ajkpro
сообщение Feb 12 2013, 17:43
Сообщение #8





Группа: Участник
Сообщений: 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() там нет.
Go to the top of the page
 
+Quote Post
ajkpro
сообщение Feb 13 2013, 03:49
Сообщение #9





Группа: Участник
Сообщений: 10
Регистрация: 10-02-13
Пользователь №: 75 568



Вот, map файл: http://yadi.sk/d/po6sankd2_2yQ



Сообщение отредактировал ajkpro - Feb 13 2013, 03:50
Go to the top of the page
 
+Quote Post
xemul
сообщение Feb 13 2013, 09:15
Сообщение #10



*****

Группа: Свой
Сообщений: 1 928
Регистрация: 11-07-06
Пользователь №: 18 731



Код
void main(void) {
...
  while (1) {}
}

?
Go to the top of the page
 
+Quote Post
ajkpro
сообщение Feb 13 2013, 16:39
Сообщение #11





Группа: Участник
Сообщений: 10
Регистрация: 10-02-13
Пользователь №: 75 568



Цитата(xemul @ Feb 13 2013, 13:15) *
Код
void main(void) {
...
  while (1) {}
}

?

Ну, цикл-то есть. И им заканчивается программа. Там просто пример. Зажигаются по очереди по таймеру две лампочки.
Go to the top of the page
 
+Quote Post
xemul
сообщение Feb 13 2013, 17:54
Сообщение #12



*****

Группа: Свой
Сообщений: 1 928
Регистрация: 11-07-06
Пользователь №: 18 731



Цитата(ajkpro @ Feb 13 2013, 20:39) *
Ну, цикл-то есть. И им заканчивается программа. Там просто пример. Зажигаются по очереди по таймеру две лампочки.

Может таки в .map заглянете? Там чёрным по-английски резервируется место под int, возвращаемый main(), и подтягивается функция, его возвращающая. Угадаете с трёх раз её имя?
Go to the top of the page
 
+Quote Post
ajkpro
сообщение Feb 13 2013, 18:42
Сообщение #13





Группа: Участник
Сообщений: 10
Регистрация: 10-02-13
Пользователь №: 75 568



Цитата(xemul @ Feb 13 2013, 21:54) *
Может таки в .map заглянете? Там чёрным по-английски резервируется место под int, возвращаемый main(), и подтягивается функция, его возвращающая. Угадаете с трёх раз её имя?


Да, я то не против. Только я первый раз смотрю. Нифига ни вижу.
А, допустим, увижу. Что дальше?
У автора так работает. Почему на этом компиляторе так не катит? И как sys. срабатывает?

Александр.
Go to the top of the page
 
+Quote Post
alx2
сообщение Feb 14 2013, 05:44
Сообщение #14


Местный
***

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Feb 14 2013, 14:58
Сообщение #15


фанат дивана
******

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



Цитата(ajkpro @ Feb 13 2013, 09:49) *
Вот, map файл: http://yadi.sk/d/po6sankd2_2yQ

Короче, дело в следующем.
1. sys.c - забудьте про него, это совсем из другой оперы.
2. В вашем проекте почему-то вместо файла stm32_lib/device_support/gcc/startup_stm32f10x_md_vl.S используется файл начальной инициализации, предоставляемый компилятором по умолчанию. И он зачем-то вызывает _exit(). Это может быть действительно глюк компилятора.
3. Если вас это устраивает, просто добавьте в файл main.c функцию
Код
void _exit(int i)
{
    while (1);
}

А вообще, тот шаблон, который вы себе выбрали для старта - не очень удачный. Видите, сколько возни для того, чтобы просто скомпилировать его. Лучше возьмите другой шаблон, где всё сразу сделано нормально. Например, вот отсюда.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 20th July 2025 - 09:58
Рейтинг@Mail.ru


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