1
5
level). Như vậy, soname thư viện C là libc.5. Thư viện libc6 có soname là libc.so.6, sự thay
đổi phiên bản chính là sự thay đổi đáng kể thư viện. Phiên bản phụ và patch level thay đổi
khi lỗi được sửa nhưng soname không thay đổi và bản mới có sự thay khác biệt đáng kể so
với bản cũ.
Các chương trình ứng dụng liên kết dựa vào soname. Tiện ích idconfig tạo một biểu
tượng liên kết từ thư viện chuẩn libc.so.5.4.46 tới soname libc.5 và lưu trữ thông tin này
trong /etc/ld.so.cache. Trong lúc chạy, ld.so đọc phần lưu trữ, tìm soname thích hợp và
nạp thư viện hiện tai vào bộ nhớ, kết nối hàm ứng dụng gọi tới đối tượng thích hợp trong
thư viện.
Các phiên bản thư viện khác nhau nếu:
Các giao diện hàm đầu ra thay đổi.
Các giao diện hàm mới được thêm.
Chức năng hoạt động thay đổi so với đặc tả ban đầu
Cấu trúc dữ liệu đầu ra thay đổi
Cấu trúc dữ liệu đầu ra được thêm
Để duy trì tính tương thích của thư viện, cần đảm bảo các yêu cầu:
Không thêm vào những tên hàm đã có hoặc thay đổi hoạt động của nó
Chỉ thêm vào cuối cấu trúc dữ liệu đã có hoặc làm cho chúng có tính tuỳ chọn hay
được khởi tạo trong thư viện
Không mở rộng cấu trúc dữ liệu sử dụng trong các mảng
Xây dựng thư viện dùng chung hơi khác so với thư viện tĩnh, quá trình xây dựng thư
viện dùng chung được minh hoạ dưới đây:
Khi biên dịch file đối tượng, sử dụng tùy chọn -fpic của gcc nó sẽ tạo ra mã độc lập
vị trí (position independence code) từ đó có thể liên kết hay sử dụng ở bất cứ chỗ
nào
Không loại bỏ file đối tượng và không sử dụng các tùy chọn –fomit –frame -pointer
của gcc, vì nếu không sẽ ảnh hưởng đến quá trình gỡ rối (debug)
Sử dụng tuỳ chọn -shared and –soname của gcc
Sử dụng tuỳ chọn –Wl của gcc để truyền tham số tới trình liên kết ld.
Thực hiện quá trình liên kết dựa vào thư viện C, sử dụng tuỳ chọn –l của gcc
Trở lại thư viện xử li lỗi , để tạo thư viện dùng chung trước hết xây dụng file đối tượng:
$ gcc -fPiC -g -c liberr.c -o liberr.o
Tiếp theo liên kết thư viện:
$ gcc -g -shared -Wl,-soname,liberr.so -o liberr.so.1.0.0 liberr.o -lc
Vì không thể cài đặt thư viện này như thư viện hệ thống trong /usr hay /usr/lib chúng ta
cần tạo 2 kiên kết, một cho soname:
Và cho trình liên kết khi kết nối dựa vào liberr, sử dụng –lerr:
$ ln -s liberr.so.1.0.0 liberr.so
Bây giờ, để dử dụng thư viện dùng chung mới chúng ta quay lại chương trình kiểm tra,
chúng ta cần hướng trình liên kết tới thư viện nào để sử dụng và tìm nó ở đâu, vì vậy chúng
ta sẽ sử dụng tuỳ chọn –l và –L:
$ gcc -g errtest.c -o errtest -L. -lerr
Cuối cùng để chạy chưong trình, chúng ta cần chỉ cho ld.so nơi để tìm thư viện dùng
chung :
$ LD_LIBRARY_PATH=$(pwd) ./errtest
7.3.4.3 Sử dụng đối tượng dùng chung theo cách động