2011-04-23 19 views
10

_sbrk에 문제가 있습니다. 컴파일의 링크 단계에서 나는 아래의 명령을 사용하여 내 객체를 연결하고 _sbrk에 대한 정의되지 않은 참조를 얻습니다. 내가 ARM926EJ-S과 ARM 모드에서 컴파일하고정의되지 않은 참조 _sbrk

arm-none-eabi-ld -static -T linkerscript.ld -o exe timer_example.o /home/ziga/projects/cs_lite/arm-none-eabi/lib/libc.a /home/ziga/projects/cs_lite/lib/gcc/arm-none-eabi/4.5.1/libgcc.a 

그래서 내가 폴더 홈/ziga/프로젝트/cs_lite/팔에있는 바로 multilib (libc.a와 libgcc.o로)를 선택한 생각 -none-eabi/lib /.

저는 인터넷에서 _sbrk 함수를 검색해 왔으며 마이크로 프로세서에 의존하기 때문에 표준 C 라이브러리에 포함되어 있지 않은 일종의 메모리 관리 호출입니다. Soo는 자체적으로 _sbrk 함수를 작성해야합니까? 어떻게해야합니까? arm926ej-s에 대한 예가 있습니까? 이 함수를 작성한 후에는 객체 파일로 컴파일하고 다른 객체, 라이브러리와 함께 링크하려고합니다.

친절한 관계로, Ziga.


나는이 문제를 해결하고 난 뒤 comunity 뭔가를 줄 수 있도록 여기에 솔루션을 게시 할 예정입니다. _sbrk 함수는 ARM 용 NXP CDL 패키지 안에 있습니다. 하위 폴더 CDL_v005/CSP를/lpc313x/BSP와/ea3131/당신이 추가되어야 소스 파일 라는 이름의 libnosys_gnu.c를 찾을 소스에서 http://www.lpclinux.com/Downloads/WebHome : 패키지 은 여기 (링크는 이미 알고 그나마 모든 사람을위한)을 다운로드 할 수 있습니다 프로젝트를 컴파일하고 파일을 오브젝트로 컴파일 한 후 다른 오브젝트와 함께 실행 파일에 링크하고 라이브러리를 생성합니다.

최고의 성공과 많은 성공.

+7

실제로 질문을 편집하는 대신 해당 답변을 _answer_에 입력해야합니다. 자신의 질문에 대답하는 것은 좋습니다 (심지어 그것을 받아들이는 것조차도). – paxdiablo

답변

3

이 도움이 :

-mcpu = 코어 텍스 M4 -mthumb -specs = nano.specs -specs = nosys.사양 -mfpu = fpv4-SP-D16 -mfloat-ABI = 하드

중요한 스위치로 "같다"

-specs = nano.specs -specs = nosys.specs

3

이 문제는 _sbrk 자체와 관련이 거의 없으며 컴파일러 드라이버를 거치지 않고 직접 링커를 호출하려는 시도입니다. 대신 gcc 명령을 사용하여 링커를 호출하고 -Wl,-linkeroptionhere 구문을 사용하여 추가 옵션을 링커에 전달하십시오.

링커를 직접 호출해야하는 경우 가능한 한 가지 방법은 명령 줄 끝에 libc.alibgcc.a을 두 번 반복하는 것입니다. 또한 이것을 달성하는 데 사용할 수있는 "그룹으로"링커 옵션이 있지만 바로 알지 못합니다.

+0

수정 된 게시물에서 내 문제를 수정했습니다. – 71GA

2

최근에 나는 또한 이것 (다시)을 만났다. 저에게 도움이 된 가장 쉬운 해결책은 "malloc"과 "무료"apis를 내 응용 프로그램을 빌드하는 SDK에서 사용할 수있는 API로 제공/리디렉션하는 것이 었습니다.

기본적으로 이것은 링크하는 동안 누락 된 관리 API가 있기 때문에 발생합니다. 위의 대답과 마찬가지로 _sbrk이 구체적으로 누락되지 않았 음을 언급합니다. brk/sbrk syscall은 내부적으로 힙 관리에 사용됩니다. 따라서 _sbrk, 누락 된 링크는 mem 관리 api에 관해서.

-lnosys (예 : libnosys.a)를 추가하면 일부 통합에서 어느 정도 도움이되었음을 확인했습니다.