GNU/Linux >> Tutoriels Linux >  >> Linux

Comment lier la bibliothèque d'exécution C avec 'ld' ?

Si vous voulez appeler des fonctions de bibliothèque simples comme atoi , mais évitez toujours d'utiliser le runtime C, vous pouvez le faire. (c'est-à-dire que vous écrivez _start , plutôt que d'écrire simplement un main qui est appelé après un tas d'exécutions de code passe-partout.)

gcc -o swap -nostartfiles swap.o

Comme les gens le disent dans les commentaires, certaines parties de la glibc dépendent des constructeurs/destructeurs exécutés à partir des fichiers de démarrage standard. C'est probablement le cas pour stdio (puts/printf/scanf/getchar), et peut-être malloc. Cependant, de nombreuses fonctions sont des fonctions "pures" qui ne font que traiter l'entrée qui leur est donnée. sprintf/sscanf peut être bon à utiliser.

Par exemple :

$ 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

Voici un exemple qui utilise libc sans utiliser 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

Compilez et liez comme ceci :

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

Cela a bien fonctionné pour moi jusqu'à présent, mais pour la liaison statique, c'est compliqué.


Linux
  1. Comment Kali gère la prochaine fin de vie de Python 2

  2. Comment ajouter un fichier .so au java.library.path sous Linux

  3. Comment savoir que la bibliothèque partagée donnée est construite avec des symboles de débogage ou non ?

  4. Comment puis-je créer un lien vers une ancienne version d'une bibliothèque partagée

  5. Comment actualiser l'état magnétique d'un disque avec des sauvegardes ?

Comment utiliser la commande IP sous Linux avec des exemples

Comment utiliser la commande Linux sleep avec des exemples

Comment utiliser la commande who sous Linux avec des exemples

Comment utiliser la commande RPM (avec exemples)

Comment rechercher des fichiers avec la commande fd sous Linux

Création de tracés statistiques avec la bibliothèque Seaborn Python