Pergunta

Eu construí um programa de ELF de teste usando o LSB SDK (Observe que minha pergunta não é específica para LSB):

$ /opt/lsb/bin/lsbcc tst.c
$ ls -l a.out 
-rwxr-xr-x 1 math math 10791 2009-10-13 20:13 a.out
$ file a.out 
a.out: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.15, not stripped

Mas não consigo lançá -lo (Sim, eu garanto a você o arquivo é no diretório ...):

$ ./a.out 
bash: ./a.out: No such file or directory

$ uname -a
Linux math 2.6.28-15-generic #52-Ubuntu SMP Wed Sep 9 10:48:52 UTC 2009 x86_64 GNU/Linux

Eu acho que há uma dependência de elfos que não é cumprida, mas não sei como encontrá -la. Existe uma ferramenta semelhante ao LDD para bibliotecas que podem ser usadas para encontrar o link ausente?

Eu não acho que esteja relacionado à diferença 2.6.15/2.6.28-15 porque o compilador LSB está funcionando:

$ file /opt/lsb/bin/lsbcc 
/opt/lsb/bin/lsbcc: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.4, not stripped

Apenas para o caso, aqui está a seção dinâmica da ELF de A.out:

 0x0000000000000001 (NEEDED)             Shared library: [libpthread.so.0]
 0x0000000000000001 (NEEDED)             Shared library: [libm.so.6]
 0x0000000000000001 (NEEDED)             Shared library: [libc.so.6]
 0x000000000000000c (INIT)               0x400428
 0x000000000000000d (FINI)               0x400638
 0x0000000000000004 (HASH)               0x400278
 0x0000000000000005 (STRTAB)             0x400350
 0x0000000000000006 (SYMTAB)             0x4002a8
 0x000000000000000a (STRSZ)              121 (bytes)
 0x000000000000000b (SYMENT)             24 (bytes)
 0x0000000000000015 (DEBUG)              0x0
 0x0000000000000003 (PLTGOT)             0x600fe8
 0x0000000000000002 (PLTRELSZ)           24 (bytes)
 0x0000000000000014 (PLTREL)             RELA
 0x0000000000000017 (JMPREL)             0x400410
 0x0000000000000007 (RELA)               0x4003f8
 0x0000000000000008 (RELASZ)             24 (bytes)
 0x0000000000000009 (RELAENT)            24 (bytes)
 0x000000006ffffffe (VERNEED)            0x4003d8
 0x000000006fffffff (VERNEEDNUM)         1
 0x000000006ffffff0 (VERSYM)             0x4003ca
 0x0000000000000000 (NULL)               0x0
Foi útil?

Solução

Parece o que acontece quando o intérprete de elfo está faltando.

Garanta que /lib/ld-lsb.so.2 (ou similar; varia de acordo com a versão e arquitetura LSB). ldd e readelf -l Será capaz de mostrar ao intérprete ELF que seu executável está solicitando.

(lsbcc (ou algo na cadeia de ferramentas LSB) substitui o padrão do sistema /lib/ld-linux.so.2, provavelmente passando -Wl,--dynamic-linker=/lib/ld-lsb.so.2 Para o compilador, por razões que eu acho que são bobas (o Glibc sempre forneceu excelente compatibilidade com antecedência aqui), mas aí está.)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top