Pada sistem Linux 32-bit, gunakan ini
$ /lib/libc.so.6
dan pada sistem 64-bit ini
$ /lib/x86_64-linux-gnu/libc.so.6
dalam sebuah shell, berikan output seperti ini:
GNU C Library stable release version 2.10.1, by Roland McGrath et al.
Copyright (C) 2009 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.
Compiled by GNU CC version 4.4.0 20090506 (Red Hat 4.4.0-4).
Compiled on a Linux >>2.6.18-128.4.1.el5<< system on 2009-08-19.
Available extensions:
The C stubs add-on version 2.1.2.
crypt add-on version 2.1 by Michael Glad and others
GNU Libidn by Simon Josefsson
Native POSIX Threads Library by Ulrich Drepper et al
BIND-8.2.3-T5B
RT using linux kernel aio
For bug reporting instructions, please see:
<http://www.gnu.org/software/libc/bugs.html>.
Mengapa dan bagaimana hal ini terjadi, dan bagaimana mungkin melakukan hal yang sama di perpustakaan bersama lainnya?
Saya melihat /usr/lib
untuk menemukan executable, dan saya menemukan /usr/lib/libvlc.so.5.5.0
. Menjalankannya menyebabkan kesalahan segmentasi . : - /
Jawaban:
Pustaka itu memiliki
main()
fungsi atau titik masuk yang setara, dan dikompilasi sedemikian rupa sehingga berguna baik sebagai objek yang dapat dieksekusi maupun sebagai objek bersama.Berikut ini satu saran tentang cara melakukan ini, meskipun tidak berhasil untuk saya.
Berikut ini jawaban lain untuk pertanyaan serupa tentang SO , yang tanpa malu-malu saya akan menjiplak, mengubah, dan menambahkan sedikit penjelasan.
Pertama, sumber misalnya perpustakaan kami,
test.c
:Kompilasi itu:
Di sini, kami sedang mengkompilasi pustaka bersama (
-fPIC
), tetapi memberi tahu linker bahwa itu adalah executable biasa (-pie
), dan membuat tabel simbolnya dapat diekspor (-Wl,-E
), sehingga dapat dihubungkan dengan berguna.Dan, meskipun
file
akan mengatakan itu adalah objek bersama, itu berfungsi sebagai executable:Sekarang kita perlu melihat apakah itu benar-benar dapat dihubungkan secara dinamis. Contoh program
program.c
,:Menggunakan
extern
save, kita harus membuat header. Sekarang kompilasi itu:Sebelum kita dapat menjalankannya, kita perlu menambahkan path
libtest.so
untuk loader dinamis:Sekarang:
Dan
ldd a.out
akan menunjukkan tautan kelibtest.so
.Perhatikan bahwa saya ragu ini adalah bagaimana glibc sebenarnya dikompilasi, karena mungkin tidak se portable glibc itu sendiri (lihat
man gcc
berkaitan dengan-fPIC
dan-pie
switch), tetapi ini menunjukkan mekanisme dasar. Untuk detail nyata Anda harus melihat sumber makefile.sumber
nm
di shared library, tapi itu bukan versi debug. Jadi, mengapalibvlc
dan yang lainnya macet?libc
adalah pengecualian.ld
danlibpthread
.ld.so
spesial dalam hal lain. Dalam batas tertentu, ini lebih merupakan executable nyata daripada executable yang terhubung secara dinamis normal.Mari selami jawaban dalam repo glibc acak di github. Versi ini menyediakan "banner" di file
version.c
.Dalam file yang sama ada beberapa poin menarik:
__libc_print_version
fungsi yang menyediakan pencetakan untuk stdin teks dan simbol__libc_main (void)
yang sama yang didokumentasikan sebagai titik masuk. Jadi simbol ini disebut saat menjalankan perpustakaan.Jadi bagaimana linker / compiler tahu bahwa ini adalah fungsi entry point?
Mari selami makefile . Di bendera tautan ada bendera yang menarik:
Jadi ini adalah bendera penghubung untuk mengatur titik masuk di perpustakaan. Saat membangun perpustakaan, Anda dapat menyediakan
-e function_name
tautan yang membuat perilaku yang dapat dieksekusi. Apa itu sebenarnya? Mari kita lihat manualnya (agak tanggal tetapi masih valid) :(dokumentasi saat ini dapat ditemukan di sini )
Benar-benar
ld
linker tidak membuat executable dengan fungsi titik masuk jika Anda menyediakannya dengan opsi baris perintah-e
(solusi paling praktis), memberikan simbol fungsistart
, atau menyuntikkan alamat simbol di assembler.Namun harap dicatat bahwa itu jelas tidak dijamin untuk bekerja dengan linker lain (saya tidak tahu apakah lld llvm memiliki flag yang sama). Mengapa ini harus bermanfaat untuk tujuan selain memberikan info tentang file tersebut, saya tidak tahu.
sumber