2016-08-19 4 views
0

GNU ARM Embedded 툴체인 (gcc-arm-none-eabi-5_4)을 사용하는 Cortex-M4 (STM32F4-Discovery 보드) -2016q2). 내 코드 (HAL-lib, CMSIS, 시작 등)의 하드웨어 종속적 인 부분은 정적 라이브러리에 내장되어있어 응용 프로그램 코드에 연결하려고합니다. 내 응용 프로그램 코드에 main 기호가 포함되어 있으며 내 라이브러리에 _sbrk 기호가 포함되어 있습니다.'main'및 _sbrk에 대한 정의되지 않은 참조 - 자신의 정적 라이브러리에있는 시작 코드

engine_control/source/os/release/libkosmos-arm-stm32f4-discovery.a(_startup.o): In function `_start': 
_startup.c:(.after_vectors+0x9a): undefined reference to `main' 

과 :

/opt/gcc-arm-none-eabi-5_4-2016q2/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7e-m/fpu/libc_nano.a(lib_a-sbrkr.o): In function `_sbrk_r': 
sbrkr.c:(.text._sbrk_r+0xc): undefined reference to `_sbrk' 

내 링크 순서에 문제가있는 가정이 오류 메시지입니다. 다음은 내 링크 명령입니다.

arm-none-eabi-g++ -mcpu=cortex-m4 -mthumb -mfloat-abi=hard -mfpu=fpv4-sp-d16 -Os -fmessage-length=0 -fsigned-char -ffunction-sections -fdata-sections -ffreestanding -fno-move-loop-invariants -Werror -Wunused -Wuninitialized -Wall -Wextra -Wmissing-declarations -Wconversion -Wpointer-arith -Wpadded -Wshadow -Wlogical-op -Waggregate-return -Wfloat-equal -T mem.ld -T libs.ld -T sections.ld -nostartfiles -Xlinker --gc-sections -L"config/linker" --specs=nano.specs -L/home/tkl/git/engine_control/source/os/release -Wl,-Map,"/home/tkl/git/engine_control/release/map/arm/release/.map" -lkosmos-arm-stm32f4-discovery -o "/home/tkl/git/engine_control/release/execute/arm/release/.elf" 

무엇이 잘못 되었나요?

+0

실제로 연결 하시겠습니까? 'main' _supposed_는 어디에 있습니까? 그 링크 명령은 하나의 라이브러리 및 객체 파일을 포함하는 것 같습니다 ... – Notlikethat

+0

고마워, 네 말이 맞아. 주 객체를 연결하는 것을 놓쳤습니다 (불행하게도 객체를 정의하고 makefile에서 객체를 사용하기 위해 여러 변수 이름을 사용했기 때문에). – user3592527

답변

0

참고 시작 코드를 라이브러리에 넣으면 링커에서 가져올 좋은 이유가 없습니다. 일반적으로 다른 코드 부분에서 호출하지 않기 때문에 아무도 요청하지 않습니다. - 이미지에서 원하는 내용 시작 코드 과 같은 비용은 연결하는 동안 오브젝트 파일에이되어야합니다. 그리고 그 오브젝트 파일은 아마 main과 다른 모든 종류의 심볼을 호출하고 심볼을 적절히 해결하기 위해 이후에 이후에 올 필요가 있기 때문에 링크 파일에 먼저 있어야합니다.

다른 하나는 sbrk에 대한 참조가 없다고 불평하는 sbrk_r입니다. 두 파일 모두 내 라이브러리에 있다고 가정합니다. 적절한 색인을 작성하려면 라이브러리를 ranlib으로 실행하여 해결할 수 있습니다.

+1

진짜 호기심 : 실제로 입력 파일 중 하나로 전달되는 링커 스크립트가 있다고 가정하고 (즉, 시작 코드에있는 진입 점, 예외 벡터 등을 배치하는) 명시 적 기호 참조가에서 참조로 간주되지 않습니다. '도서관 탐색'의 관점? – Notlikethat

+1

링커에게 특정 기호를 특정 주소로 보내라고 말하면 yes입니다. 그러나 OP는 (우리에게) 하나도 발표하지 않았다. 세그먼트 이름과 링커 스크립트에서 원하는 주소가 많지 않은 경우 (일반적으로 사용하려고 시도 할 때 완벽하게 유효하며 일반적으로 무엇을 할 것인가), 아니오를 선택합니다. – tofro

+0

시작 코드가 여러 객체로 구성되어 있으면 부분 링크가 매우 편리합니다. –