GNU/Linux >> Linux Esercitazione >  >> Linux

Come collegare la libreria di runtime C con 'ld'?

Se vuoi chiamare semplici funzioni di libreria come atoi , ma evita comunque di utilizzare il runtime C, puoi farlo. (cioè scrivi _start , piuttosto che scrivere semplicemente un main che viene chiamato dopo l'esecuzione di un mucchio di codice standard.)

gcc -o swap -nostartfiles swap.o

Come si dice nei commenti, alcune parti di glibc dipendono dai costruttori/distruttori eseguiti dai file di avvio standard. Probabilmente questo è il caso di stdio (puts/printf/scanf/getchar) e forse di malloc. Tuttavia, molte funzioni sono funzioni "pure" che elaborano semplicemente l'input che ricevono. sprintf/sscanf potrebbe essere ok da usare.

Ad esempio:

$ cat >exit64.asm  <<EOF
section .text

extern exit

global _start
_start:

    xor edi, edi
    jmp exit            ; doesn't return, so optimize like a tail-call

    ;; or make the syscall directly, if the jmp is commented
    mov eax, 231    ;  exit(0)
    syscall

;   movl eax, 1     ; 32bit call
;   int 0x80
EOF

$ yasm -felf64 exit64.asm && gcc -nostartfiles exit64.o -o exit64-dynamic
$ nm exit64-dynamic
0000000000601020 D __bss_start
0000000000600ec0 d _DYNAMIC
0000000000601020 D _edata
0000000000601020 D _end
                 U [email protected]@GLIBC_2.2.5
0000000000601000 d _GLOBAL_OFFSET_TABLE_
00000000004002d0 T _start
$ ltrace ./exit64-dynamic 
enable_breakpoint pid=11334, addr=0x1, symbol=(null): Input/output error
exit(0 <no return ...>
+++ exited (status 0) +++
$ strace ... # shows the usual system calls by the runtime dynamic linker

Ecco un esempio che utilizza libc senza usare GCC.

extern printf
extern _exit

section .data
    hello:     db 'Hello world!',10

section .text
    global _start   
_start:
    xor eax, eax
    mov edi, hello
    call printf
    mov rax, 0    
    jmp _exit

Compila e collega in questo modo:

nasm -f elf64 hello.asm
ld hello.o -dynamic-linker /lib64/ld-linux-x86-64.so.2 -lc -m elf_x86_64

Finora ha funzionato bene per me, ma per il collegamento statico è complicato.


Linux
  1. Come controllare i permessi con il comando trova

  2. Come Kali si occupa dell'imminente Python 2 End-of-Life

  3. Come reinstallare la libreria danneggiata con yum

  4. Come posso collegarmi a una versione precedente di una libreria condivisa

  5. Come posso scaricare collegamenti magnetici tramite la riga di comando con rtorrent su Linux?

Come utilizzare il comando IP in Linux con esempi

Come utilizzare il comando sleep di Linux con esempi

Come utilizzare il comando who in Linux con esempi

Come utilizzare il comando RPM (con esempi)

Come trovare file con il comando fd in Linux

Creazione di grafici statistici con la libreria Python di Seaborn