bài này cung cấp cho bạn hiểu biết cơ bản về Linux library (và nó có thể đúng với các UNIX-like OS khác như BSD, Solaris, ...)
Ai nên đọc bài này:
- C/C++ programmer
- Sysadmin - để troubleshooting
- Người thích tìm hiểu về Linux
Có 3 loại library:
- static libraries
- shared libraries
- dynamically loaded libraries.
- dynamically linked library (DLL) : là từ mà một số người gọi shared library, một số lại dùng để gọi DL library.
- một số định dạng của file chạy và thư viện:
- Executable and Linking Format (ELF)
- a.out
hvn@lappy: ~/Documents () $ file `which ps`1. static library
/bin/ps: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.15, BuildID[sha1]=0x41f91a7889ac50b444eacb4e7ae77361b67edca9, stripped
Là một tập hợp các file object (file .o, nếu bạn đã từng dùng gcc compile helloworld.c bạn sẽ biết ). Chúng được đóng trong 1 archive (lệnh ar) và có đuôi ".a"
root@lappy: ~ () # whatis arVD:
ar (1) - create, modify, and extract from archives
thư viện my_library.a có thể tạo ra với câu lệnh
ar rcs my_library.a file1.o file2.o
Một static library có thể sử dụng bằng một số cách sau:
- lệnh `ld`
root@lappy: ~ () # whatis ld
ld (1) - The GNU linker - với option -l khi dùng gcc
2. shared library
Là loại thư viện mà chương trình sẽ load khi khởi động
Mỗi shared library có 3 cái tên
- soname
- real name = soname thêm .MINOR number [.RELEASE number]
- linker name (tên dùng khi link ) = soname bỏ đi phần version
Soname có cấu trúc như sau:
lib + tên_thư_viện + .so + .VERSION_NUMBER
Để xem một chương trình có sử dụng shared library nào, ta dùng lệnh `ldd`
root@lappy: ~ () # whatis ldd
ldd (1) - print shared library dependencies
Thử với chương trình `echo`
root@lappy: ~ () # ldd `which echo`Output cho thấy lệnh echo sử dụng 2 shared library là linux-vdso.so.1 và libc.so.6
linux-vdso.so.1 => (0x00007fff1654e000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fbca4bda000)
/lib64/ld-linux-x86-64.so.2 (0x00007fbca4fbb000)
Hai chương trình phổ biến khi tìm hiểu về shared library là ld.so và ldconfig
(Ước gì ngày xưa em học C tử tế :(( )
Liệt kê tất cả các thư viện:
root@1204x86:~# ldconfig -v
Realname
là filename chứa code của library đó.
Realname = soname + .MINOR number [+ . RELEASE number](MINOR : phụ, MAJOR: chính)
Chương trình chỉ sử dụng soname.
Khi ta tạo 1 library thì ta dùng realname
Ví dụ:
root@1204x86:~# ls -l /lib/i386-linux-gnu/libattr.so.1Trong /usr/lib chứa rất nhiền thư viện (cả static lẫn shared)
lrwxrwxrwx 1 root root 16 Dec 18 2011 /lib/i386-linux-gnu/libattr.so.1 -> libattr.so.1.1.0
ở đây:
- /lib/i386-linux-gnu/libattr.so.1 là soname
- /lib/i386-linux-gnu/libattr.so.1.1.0 là realname
root@1204x86:~# ls /usr/lib/GNU có tiểu chuẩn đặt các shared lib trong /usr/local/lib
FHS ( Filesystem Hierarchy Standard) cho rằng hầu hết các thư viện nên để trong /usr/lib, các thư viện cần cho việc khởi động thì đặt trong /lib, các thư viện khác nằm trong /usr/loca/lib
Việc đặt các thư viện ở đâu phụ thuộc vào từng distro quy định.
3. dynamically loaded libraries (DL)
DL được chương trình load sau khi khởi động, nó rất hữu ích cho việc implement các plugin, module vì nó cho phép chỉ load thư viện khi cần.
Điểm khác biệt của DL và 2 loại lib trên là nó không được load tự động tại thời điểm link hay lúc khởi động, thay vào đó là một bộ API để mở thư viện , tìm kiếm, xử lý lỗi và đóng thư viện. C programmer cần include header <dlfcn.h> để sử dụng API này.
Một số thư viện giúp việc sử dụng các library qua API nói trên trở nên portable trên các hệ điều hành khác nhau, có thể kể đến glib, libltdl.
Đến đây, người đọc đã có thể hiểu phần nào về các loại thư viện trên, còn muốn tìm hiểu sâu hơn, chúng ta cần đến một lập trình viên C hay C++ trên UNIX-like OS.
Tham khảo:
http://tldp.org/HOWTO/Program-Library-HOWTO/index.html
PS:
1. bài này lúc đầu tên là Linux Library nhưng đổi tên tiếng Việt để tối ưu SEO :3
No comments:
Post a Comment