Tuesday, 4 June 2013

Thư viện trên Linux

UPDATED: thêm lệnh liệt kê tất cả thư viện

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
Library ở đây chỉ thư viện dùng trong lập trình (program library), là nơi chưa các hàm, lập trình viên chỉ cần import chúng và dùng.

Có 3 loại library:
  1.  static libraries
  2.  shared libraries
  3. dynamically loaded libraries.
Một số khái niệm liên quan:

- 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
ELF là loại hiện đại hơn. Bạn có thể dùng lệnh `file` để xem 1 file chạy sử dụng format nào, ví dụ sau xem file chạy của lệnh `ps`:

hvn@lappy: ~/Documents () $ file `which ps`
/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
1. static library
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 ar
ar (1)               - create, modify, and extract from archives
VD:
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
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`
        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)
Output cho thấy lệnh echo sử dụng 2 shared library là linux-vdso.so.1 và libc.so.6
Hai chương trình phổ biến khi tìm hiểu về shared library là ld.soldconfig
(Ướ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.1
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
Trong /usr/lib chứa rất nhiền thư viện (cả static lẫn shared)

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