GNU/Linux >> Belajar Linux >  >> Linux

Bagaimana cara menautkan Perpustakaan C Runtime dengan 'ld'?

Jika Anda ingin memanggil fungsi pustaka sederhana seperti atoi , tetapi tetap hindari menggunakan runtime C, Anda bisa melakukannya. (yaitu Anda menulis _start , daripada hanya menulis main yang dipanggil setelah banyak kode boiler-plate berjalan.)

gcc -o swap -nostartfiles swap.o

Seperti yang dikatakan orang dalam komentar, beberapa bagian glibc bergantung pada konstruktor/destruktor yang dijalankan dari file startup standar. Mungkin ini kasus stdio (puts/printf/scanf/getchar), dan mungkin malloc. Banyak fungsi adalah fungsi "murni" yang hanya memproses input yang diberikan. sprintf/sscanf mungkin boleh digunakan.

Misalnya:

$ 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

Berikut adalah contoh yang menggunakan libc tanpa menggunakan 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

Kompilasi dan tautkan seperti ini:

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

Ini telah bekerja dengan baik sejauh ini untuk saya tetapi untuk tautan statis itu rumit.


Linux
  1. Bagaimana Kali menangani Akhir Kehidupan Python 2 yang akan datang

  2. Cara Menginstal Ulang Perpustakaan yang Rusak dengan yum

  3. Bagaimana cara menambahkan file .so ke java.library.path di Linux

  1. Bagaimana cara mengetahui perpustakaan bersama yang diberikan dibangun dengan simbol debug atau tidak?

  2. Bagaimana cara mengunduh tautan magnet melalui baris perintah dengan rtorrent di Linux?

  3. Bagaimana cara menyegarkan status magnetik pada disk dengan cadangan?

  1. Cara mengaudit izin dengan perintah find

  2. Bagaimana cara mengganti konten kolom tertentu dengan awk?

  3. Bagaimana cara memverifikasi kecepatan NIC saya?