GNU/Linux >> Belajar Linux >  >> Linux

Linux – Apakah Semua Program C Perlu Memuat Perpustakaan?

Dengan program seperti

int main()
{
   return 0;
}
  • dan Anda menautkan secara statis, apakah beberapa perpustakaan di sistem Anda akan ditautkan ke biner terakhir.
  • dan Anda menautkan secara dinamis, apakah perpustakaan akan dimuat saat dijalankan?

Intinya, apakah perpustakaan selalu dibutuhkan bahkan untuk program yang paling sederhana, jika demikian mengapa? Saya bertanya karena saya pikir titik masuk kanonik untuk apa pun yang ingin dieksekusi sebenarnya adalah _start (yang saya pikir ada di perpustakaan, yaitu glibc). Mungkin saya tidak mengerti apa yang sebenarnya dilakukan _start sehubungan dengan pengaturan, jadi petunjuk apa pun di sana juga akan membantu.

Jawaban yang Diterima:

Jika Anda ingin menulis program Anda dalam C portabel standar, tentu saja Anda memerlukan beberapa runtime yang memanggil main() fungsi di tempat pertama.

Tetapi jika Anda tidak peduli tentang itu, Anda dapat membuang perpustakaan apa pun, dan melakukan panggilan sistem secara langsung melalui perakitan sebaris. Misalnya. untuk x86-64:

$ cat q.c
#include <sys/syscall.h>
void _start(void){
        __asm__( "syscall" : : "D"(0), "a"(SYS_exit) );
}
$ cc -O2 -static -nostdlib -nostartfiles -Wall q.c -o q
$ strace ./q
execve("./q", ["./q"], 0x7fffc72d8d20 /* 39 vars */) = 0
exit(0)                                 = ?
+++ exited with 0 +++

Anda harus melakukan setidaknya satu panggilan sistem, yaitu _exit(2) , kecuali exit-by-crashing dapat diterima untuk "program paling sederhana", dalam hal ini file kosong juga akan melakukannya;-):

$ > foo.c
$ cc -static -nostdlib -nostartfiles -Wall foo.c -o ./foo
/usr/bin/ld: warning: cannot find entry symbol _start; defaulting to 0000000000401000
$ ./foo
Segmentation fault

Saya pikir titik masuk kanonik untuk apa pun yang ingin dieksekusi sebenarnya adalah _start

tidak ada yang kanonik tentang itu; _start adalah nama default yang akan digunakan penaut; Anda dapat mengarahkannya ke tempat lain dengan -e sym opsi (-Wl,-e,sym dengan gcc ).


Linux
  1. Panduan untuk memahami pustaka perangkat lunak Linux di C

  2. Cara men-debug program C di Linux menggunakan gdb

  3. Mengapa kita membutuhkan file .so.1 di Linux?

  1. Cara Memasang Pustaka Ncurses Di Linux

  2. Cara Mendaftar Semua Paket yang Terinstal Di Linux

  3. Gunakan perpustakaan C di Swift di Linux

  1. Bagaimana saya bisa menjalankan program perakitan MIPS di linux x86?

  2. Cara menginisialisasi perpustakaan bersama di Linux

  3. Menghapus instalasi program di Linux