GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Wie verknüpfe ich die C-Laufzeitbibliothek mit 'ld'?

Wenn Sie einfache Bibliotheksfunktionen wie atoi aufrufen möchten , aber vermeiden Sie trotzdem die Verwendung der C-Laufzeit, das können Sie tun. (d.h. Sie schreiben _start , anstatt nur main zu schreiben das aufgerufen wird, nachdem ein Haufen Boiler-Plate-Code ausgeführt wird.)

gcc -o swap -nostartfiles swap.o

Wie die Leute in Kommentaren sagen, hängen einige Teile von glibc von Konstruktoren/Destruktoren ab, die von den Standard-Startdateien ausgeführt werden. Wahrscheinlich ist dies bei stdio (puts/printf/scanf/getchar) und vielleicht malloc der Fall. Viele Funktionen sind jedoch "reine" Funktionen, die nur die Eingabe verarbeiten, die sie erhalten. sprintf/sscanf könnte in Ordnung sein.

Zum Beispiel:

$ 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

Hier ist ein Beispiel, das libc verwendet ohne GCC zu verwenden.

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

So kompilieren und verlinken:

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

Das hat bei mir bisher gut funktioniert, aber für die statische Verknüpfung ist es kompliziert.


Linux
  1. Wie Kali mit dem bevorstehenden Python 2 End-of-Life umgeht

  2. So installieren Sie eine beschädigte Bibliothek mit yum neu

  3. So fügen Sie eine .so-Datei zum java.library.path in Linux hinzu

  4. Wie kann ich eine Verknüpfung zu einer älteren Version einer gemeinsam genutzten Bibliothek herstellen?

  5. Wie aktualisiere ich den Magnetstatus auf einer Festplatte mit Sicherungen?

Verwendung von IP Command unter Linux mit Beispielen

So verwenden Sie den Linux-Schlafbefehl mit Beispielen

So verwenden Sie den who-Befehl in Linux mit Beispielen

Verwendung des RPM-Befehls (mit Beispielen)

So finden Sie Dateien mit dem fd-Befehl in Linux

Erstellen statistischer Diagramme mit der Seaborn Python Library