Pergunta

Eu estou construindo um projeto usando um conjunto de ferramentas GNU e tudo funciona bem até eu chegar ao vinculá-lo, onde o vinculador reclama que está faltando / não consegue encontrar crti.o. Este não é um dos meus arquivos objeto, parece estar relacionada com a libc, mas não consigo entender por que seria necessário este crti.o, não usaria um arquivo de biblioteca, por exemplo, libc.a?

Eu sou compilação cruzada para a plataforma braço. Eu tenho o arquivo no conjunto de ferramentas, mas como faço para obter o vinculador para incluí-lo?

crti.o está em um do caminho de procura 'bibliotecas', mas deveria procurar o arquivo .o no caminho da biblioteca?

é o caminho de busca da mesma para gcc e ld?

Foi útil?

Solução

crti.o é a biblioteca de inicialização, geralmente bastante pequena. Geralmente é estaticamente ligado em seu binário. Deve ser encontrada em /usr/lib.

Se você estiver executando uma distribuição binária eles tendem a colocar todas as coisas desenvolvedor em pacotes -dev (por exemplo, libc6-dev), uma vez que não é necessário para executar programas compilados, apenas para construí-los.

Você não está compilação cruzada é você?

Se você é cross-compilação é geralmente um problema com o caminho de busca do gcc que não corresponde onde seu crti.o é. Ele deveria ter sido construída quando o conjunto de ferramentas foi. A primeira coisa a verificar é gcc -print-search-dirs e ver se crti.o é em qualquer um desses caminhos.

A ligação é realmente feito por ld mas tem seus caminhos passadas a ele pelo gcc. Provavelmente a maneira mais rápida para descobrir o que está acontecendo é compilar um programa helloworld.c e strace para ver o que está sendo passado para ld e ver o que está acontecendo.

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

Abra o arquivo de log e procurar crti.o, como você pode ver meu compilador não-cruz:

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

Se você ver um monte de tentativas de open(...crti.o) = -1 ENOENT, ld está ficando confuso e você quer ver onde o caminho a sua inauguração veio ...

Outras dicas

Eu tive o mesmo problema durante a compilação cruzada. crti.o estava em / usr / lib64 , mas o vinculador não iria encontrá-lo.

Acontece que a criação de um diretório vazio / usr / lib corrigiu o problema. Parece que o vinculador iria procurar um caminho / usr / lib em primeiro lugar, e só se existir seria mesmo considerar / usr / lib64 .

Este é um bug no vinculador? Ou é este comportamento em algum lugar documentado?

No meu caso Linux Mint 18.0/Ubuntu 16.04, não tenho crti.o em tudo:

$ find /usr/ -name crti*

Eu não encontrar nada, então eu instalar o pacote de desenvolvedor:

sudo apt-get install libc6-dev

Se você encontrar algum libs leia aqui

OK eu tive que reinstalar a cadeia de ferramenta, para que os arquivos ausentes foram incluídos. Parece estranho, uma vez que deve tê-lo encontrado no caminho gcc. O principal problema I palpite era que eu tinha 15 ou mais arquivos crti.o diferentes no meu computador e não foi apontar para a correta. Ainda não faz desde mas funciona agora :-) Obrigado por sua ajuda: -)

Eu tive um problema semelhante com um cross-compiler mal set-up. Eu tenho em torno dele como assim:

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

Isso pressupõe / lib, / usr / include e assim por diante existe no local apontado pela opção sysroot. Este é provavelmente não como as coisas devem ser feitas, mas me pegou fora de problemas quando eu precisava para compilar um arquivo C simples.

Eu obter o mesmo tipo de problema em um padrão Ubuntu 8.04 instalar. I teve para obter o libc cabeçalhos desenvolvedor / arquivos manualmente para que ele funcione.

Este resolvido para mim (pjsip compilação cruzada para ARM):

export LDFLAGS='--sysroot=/home/me/<path-to-my-sysroot-parent>/sysroot'
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top