GNU/Linux >> Tutoriales Linux >  >> Linux

¿Cómo vincular la biblioteca de tiempo de ejecución de C con 'ld'?

Si desea llamar a funciones de biblioteca simples como atoi , pero aún evite usar el tiempo de ejecución de C, puede hacerlo. (es decir, escribes _start , en lugar de simplemente escribir un main que se llama después de que se ejecuta un montón de código repetitivo).

gcc -o swap -nostartfiles swap.o

Como dice la gente en los comentarios, algunas partes de glibc dependen de constructores/destructores que se ejecutan desde los archivos de inicio estándar. Probablemente este sea el caso de stdio (puts/printf/scanf/getchar), y tal vez malloc. Sin embargo, muchas funciones son funciones "puras" que solo procesan la entrada que reciben. sprintf/sscanf podría estar bien para usar.

Por ejemplo:

$ 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

Aquí hay un ejemplo que usa libc sin utilizar 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

Compile y vincule así:

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

Hasta ahora me ha funcionado bien, pero para la vinculación estática es complicado.


Linux
  1. Cómo lidia Kali con el próximo fin de vida de Python 2

  2. Cómo reinstalar la biblioteca corrupta con yum

  3. ¿Cómo saber que la biblioteca compartida dada está construida con símbolos de depuración o no?

  4. ¿Cómo puedo vincular a una versión anterior de una biblioteca compartida?

  5. ¿Cómo puedo instalar la última Anaconda con wget?

Cómo usar el comando IP en Linux con ejemplos

Cómo usar el comando de suspensión de Linux con ejemplos

Cómo usar el comando who en Linux con ejemplos

Cómo usar el comando RPM (con ejemplos)

Cómo encontrar archivos con el comando fd en Linux

Creación de gráficos estadísticos con la biblioteca Seaborn Python