문제

GNU 도구 체인을 사용하여 프로젝트를 구축하고 있는데 연결하기 전까지는 모든 것이 잘 작동하는데 링커에서 해당 프로젝트가 없거나 찾을 수 없다고 불평합니다. crti.o.이것은 내 개체 파일 중 하나가 아닙니다. libc와 관련된 것 같지만 이것이 왜 필요한지 이해할 수 없습니다. crti.o, 라이브러리 파일을 사용하지 않습니까? libc.a?

팔 플랫폼에 대해 크로스 컴파일 중입니다.툴체인에 파일이 있는데 링커가 이를 포함하도록 하려면 어떻게 해야 합니까?

crti.o '라이브러리' 검색 경로 중 하나에 있지만 다음을 찾아야 합니다. .o 파일이 라이브러리 경로에 있습니까?

검색 경로가 다음과 동일합니까? gcc 그리고 ld?

도움이 되었습니까?

해결책

crti.o 일반적으로 매우 작은 부트스트랩 라이브러리입니다.일반적으로 바이너리에 정적으로 연결됩니다.그것은에서 발견되어야한다 /usr/lib.

바이너리 배포판을 실행하는 경우 모든 개발자 관련 내용을 -dev 패키지에 넣는 경향이 있습니다(예:libc6-dev)은 컴파일된 프로그램을 실행하는 데 필요하지 않고 단지 빌드하기 위해 필요하기 때문입니다.

당신은 크로스 컴파일을 하고 있지 않습니까?

크로스 컴파일하는 경우 일반적으로 gcc의 검색 경로가 crti.o의 위치와 일치하지 않는 문제입니다.툴체인이 있을 때 빌드했어야 합니다.가장 먼저 확인해볼 것은 gcc -print-search-dirs crti.o가 해당 경로에 있는지 확인하세요.

연결은 실제로 ld에 의해 수행되지만 경로는 gcc에 의해 전달됩니다.아마도 무슨 일이 일어나고 있는지 알아내는 가장 빠른 방법은 helloworld.c 프로그램을 컴파일하고 추적하여 무엇이 ld로 전달되는지 확인하고 무슨 일이 일어나고 있는지 확인하는 것입니다.

strace -v -o log -f -e trace=open,fork,execve gcc hello.c -o test

내 비교차 컴파일러를 볼 수 있듯이 로그 파일을 열고 crti.o를 검색하십시오.

10616 execve("/usr/bin/ld", ["/usr/bin/ld", "--eh-frame-hdr", "-m", "elf_x86_64", "--hash-style=both", "-dynamic-linker", "/lib64/ld-linux-x86-64.so.2", "-o"
, "test", "/usr/lib/gcc/x86_64-linux-gnu/4."..., "/usr/lib/gcc/x86_64-linux-gnu/4."..., "/usr/lib/gcc/x86_64-linux-gnu/4."..., "-L/usr/lib/gcc/x86_64-linux-g
nu/"..., "-L/usr/lib/gcc/x86_64-linux-gnu/"..., "-L/usr/lib/gcc/x86_64-linux-gnu/"..., "-L/lib/../lib", "-L/usr/lib/../lib", "-L/usr/lib/gcc/x86_64-linux-gnu
/"..., "/tmp/cc4rFJWD.o", "-lgcc", "--as-needed", "-lgcc_s", "--no-as-needed", "-lc", "-lgcc", "--as-needed", "-lgcc_s", "--no-as-needed", "/usr/lib/gcc/x86_
64-linux-gnu/4."..., "/usr/lib/gcc/x86_64-linux-gnu/4."...],  "COLLECT_GCC=gcc", "COLLECT_GCC_OPTIONS=\'-o\' \'test\' "..., "COMPILER_PATH=/usr/lib/gcc/x86_6"..., "LIBRARY_PATH=/usr/lib/gcc/x86_64"..., "CO
LLECT_NO_DEMANGLE="]) = 0
10616 open("/etc/ld.so.cache", O_RDONLY) = 3
10616 open("/usr/lib/libbfd-2.18.0.20080103.so", O_RDONLY) = 3
10616 open("/lib/libc.so.6", O_RDONLY)  = 3
10616 open("test", O_RDWR|O_CREAT|O_TRUNC, 0666) = 3
10616 open("/usr/lib/gcc/x86_64-linux-gnu/4.2.3/../../../../lib/crt1.o", O_RDONLY) = 4
10616 open("/usr/lib/gcc/x86_64-linux-gnu/4.2.3/../../../../lib/crti.o", O_RDONLY) = 5
10616 open("/usr/lib/gcc/x86_64-linux-gnu/4.2.3/crtbegin.o", O_RDONLY) = 6
10616 open("/tmp/cc4rFJWD.o", O_RDONLY) = 7

여러번의 시도를 본다면 open(...crti.o) = -1 ENOENT, ld 은(는) 혼란스러워지고 있으며, 그 경로가 열리는 경로가 어디에서 왔는지 알고 싶습니다.

다른 팁

크로스 컴파일 중에 동일한 문제가 발생했습니다.crti.o가 있었어 <sysroot>/usr/lib64 그러나 링커는 그것을 찾지 못할 것이다.

빈 디렉토리를 생성하는 것으로 나타났습니다. <sysroot>/usr/lib 문제가 해결되었습니다.링커가 경로를 검색하는 것 같습니다. <sysroot>/usr/lib 먼저 존재하는 경우에만 고려할 것입니다. <sysroot>/usr/lib64.

이것은 링커의 버그입니까?아니면 이 동작이 어딘가에 문서화되어 있나요?

나의 경우에는 Linux Mint 18.0/Ubuntu 16.04, 나는 어떤이 없습니다 crti.o 조금도:

$ find /usr/ -name crti*

아무것도 찾지 못해서 개발자 패키지를 설치합니다.

sudo apt-get install libc6-dev

libs를 찾으면 여기를 읽어보세요

좋아, 누락된 파일이 포함되도록 도구 체인을 다시 설치해야 했습니다.gcc 경로에서 찾았어야 했기 때문에 이상해 보입니다.내 생각에 가장 큰 문제는 내 컴퓨터에 15개 정도의 서로 다른 crti.o 파일이 있는데 올바른 파일을 가리키지 않았다는 것입니다.그 이후로 아직 만들지는 않았지만 지금은 작동합니다 :-) 도움을 주셔서 감사합니다 :-)

잘못 설정된 크로스 컴파일러에서도 비슷한 문제가 발생했습니다.나는 다음과 같이 문제를 해결했습니다.

/home/rob/compiler/usr/bin/arm-linux-gcc --sysroot=/home/rob/compiler hello.c

이는 /lib, /usr/include 등이 sysroot 옵션이 가리키는 위치에 존재한다고 가정합니다.이것은 아마도 작업이 수행되어야 하는 방식이 아닐 수도 있지만 간단한 C 파일을 컴파일해야 할 때 문제를 해결해주었습니다.

기본 Ubuntu 8.04 설치에서도 같은 종류의 문제가 발생합니다.작동하려면 libc 개발자 헤더/파일을 수동으로 가져와야 했습니다.

이것은 나를 위해 해결되었습니다(ARM용 pjsip 크로스 컴파일).

export LDFLAGS='--sysroot=/home/me/<path-to-my-sysroot-parent>/sysroot'
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top