estou enfrentando um problema que consumiu muito do meu dente. Estou tentando vincular meu arquivo de objeto (pequeno programa compilado com nasm) com o vinculador ld e usando funções c. Pesquisei muito e descobri que a solução para carregar todas as c libs é passar -lc como opção para ld que honestamente silenciou todos os avisos e erros e gerou meu executável. O problema é que sempre recebo o erro "Nenhum arquivo ou diretório" quando tento executar meu programa.
Pesquisei muito na internet e encontrei esta resposta útil Ask Ubuntu Answer , mas infelizmente isso não resolveu meu problema.
algumas informações aqui:
> file main
returned:
main: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib/ld64.so.1, not stripped
A versão do programa é de 64 bits e o interpretador existe de acordo com o "comando do arquivo.
> ldd main
returned:
linux-vdso.so.1 (0x00007ffdf4bcc000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f7a10b23000)
/lib/ld64.so.1 => /lib64/ld-linux-x86-64.so.2 (0x00007f7a10f14000)
De acordo com o comando "ldd", não há biblioteca compartilhada ausente
NB: O mesmo programa compilou e vinculou com sucesso com nasm e ld no macosx adicionando essas opções
-macosx_version_min 11.0 -L /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/lib -lSystem -no_pie
para o linker ld.
EDIT1: O programa vinculado funciona sem nenhum problema quando eu removo o -lc para ld e, claro, as chamadas de funções c dentro do meu arquivo asm
EDIT2:
readelf -h main
returned:
ELF Header:
Magic: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00
Class: ELF64
Data: 2's complement, little endian
Version: 1 (current)
OS/ABI: UNIX - System V
ABI Version: 0
Type: EXEC (Executable file)
Machine: Advanced Micro Devices X86-64
Version: 0x1
Entry point address: 0x4005d0
Start of program headers: 64 (bytes into file)
Start of section headers: 19096 (bytes into file)
Flags: 0x0
Size of this header: 64 (bytes)
Size of program headers: 56 (bytes)
Number of program headers: 7
Size of section headers: 64 (bytes)
Number of section headers: 21
Section header string table index: 20
Algumas informações extras sobre o programa
Graças a este homem que compartilhou sua experiência com outras soluções aqui . graças a ele consegui resolver este problema.
Para resumir, como @steeldriver, havia um problema de intérprete. o linker está dando ao meu programa [/lib/ld64.so.1] como interpretador ELF, mas esse caminho não existe e eu o verifiquei:
Depois disso, verifiquei o caminho dos intérpretes na minha instalação do Ubuntu:
então a solução é criar um link de um desses interpretadores para o caminho do interpretador inexistente por:
Agora verificamos novamente o interpretador inexistente mais uma vez para ver se ele ainda não existe ou não:
Agora este comando retornou /lib/ld64.so.1 em vez de "arquivo inexistente". então o problema foi resolvido e eu pude executar ./main com sucesso