Sử dụng giao diện dl

Một phần của tài liệu Laapj trình shell và lập trình C trên Linux (Trang 36 - 39)

Để minh hoạ cách sử dụng dl,chúng ta quay lại thư viện xử lí lỗi, sử dụng một chương trình khác như sau:

/*

* dltest.c

* Dynamically load liberr.so and call err_ret() */ #include <stdio.h> #include <stdlib.h> #include <dlfcn.h> int main(void) { void *handle; void (*errfcn)(); const char *errmsg; FILE *pf;

handle = dlopen("liberr.so", RTLD_NOW); if(handle == NULL) {

fprintf(stderr, "Failed to load liberr.so: %s\n", dlerror()); exit(EXIT_FAILURE);

}

dlerror();

errfcn = dlsym(handle, "err_ret"); if((errmsg = dlerror()) != NULL) {

fprintf(stderr, "Didn't find err_ret(): %s\n", errmsg); exit(EXIT_FAILURE);

}

if((pf = fopen("foobar", "r")) == NULL) errfcn("couldn't open foobar"); dlclose(handle);

return EXIT_SUCCESS; }

Mã ngun chương trình dltest.c

Biên dịch ví dụ trên bằng lệnh:

$ gcc -g -Wall dltest.c -o dltest -ldl

Như tacó thể thấy, chúng ta không liên kết dựa vào liberr hay liberr.h trong mã nguồn. Tất cả truy cập tới liberr.so thông qua dl. Chạy chương trình bằng cách sau:

$ LD_LIBRARY_PATH=$(pwd) ./dltest

Nếu thành công thì ta nhận được kết quả như sau: couldn’t open foobar: No such file or directory

7.3.5 Các công c cho thư vin Công c nm Công c nm

Lệnh nm liệt kê toàn bộ các tên hàm (symbol) được mã hoá trong file đối tượng (object) và nhị phân (binary). Lệnh nm sử dụng cú pháp sau:

nm [options] file

Lênh nm liệt kê những tên hàm chứa trong file. Bảng dưới liệt kê các tuỳ chọn của lệnh nm:

Tu chn Miêu t

-C| -demangle Chuyển tên ký tự vào tên mức người dùng để cho dễđọc. -s|-print-armap Khi schỉ sốử c dủụa module chng các file lứưa hàm u trữ (phđó. ần mở rộng là “.a”), in ra các -u| -undefined-only Chlà các hàm ỉđưa ra các hàm không được định nghĩa đượở mc ộđịt file khác. nh nghĩa trong file này, tức - l | -line-numbers Sử dụng thông tin gỡ rối để in ra số dòng nơi hàm được định

nghĩa.

Các tuỳ chọn của lệnh nm Công cụ ar

Lệnh ar sử dụng cú pháp sau:

ar {dmpqrtx} [thành viên] file

Lệnh ar tạo, chỉnh sửa và trích các file lưu trữ. Nó thường được sử dụng để tạo các thư

viện tĩnh- những file mà chứa một hoặc nhiều file đối tượng chứa các chương trình con thường được sử dụng (subrountine) ởđịnh dạng tiền biên dịch (precompiled format), lệnh ar cũng tạo và duy trì một bảng mà tham chiếu qua tên ký tự tới các thành viên mà trong đó chúng được định nghĩa. Chi tiết của lệnh này đã được trình bày trong chương trước.

Công c idd

Lệnh nm liệt kê các hàm được định nghĩa trong một file đối tượng, nhưng trừ khi ta biết những gì thư viện định nghĩa những hàm nào. Lệnh idd hữu ích hơn nhiều. idd liệt kê các thư viện được chia sẻ mà một chương trình yêu cầu để mà chạy. Cú pháp của nó là:

idd [options] file

Lệnh idd in ra tên của thư viện chia sẻ mà file này sử dụng. Ví dụ: chương trình thư

“client mutt” cần 5 thư viện chia sẻ, nhưđược minh hoạ sau đây: $ idd /usr/bin/mutt

libnsl.so.1 => /lib/libns1.so.1 (0x40019000)

libslang.so.1 => /usr/lib/libslang.so.1 (0x4002e000) libm.so.6 => /lib/libm/so.6 (0x40072000)

libc.so.6 => /lib/libc.so.6 (0x4008f000)

/lib/id-linux.so.2 => /lib/id-Linux.so.2 (0x4000000)

Tìm hiu lnh idconfig

Lệnh idconfig sử dụng cú pháp sau:

Lệnh ldconfig xác định rõ các liên kết động (liên kết khi chạy) được yêu cầu bởi thư

viện được chia sẻ nằm trong các thư mục /usr/lib và /lib. Dưới đây là các tùy chọn của lệnh này:

Các tu chn Các miêu t

-p Đơn thuần chỉ in ra nội dung của /etc/ld.so.cache, một danh sách hiện thời các thư viện được chia sẻ mà ld.so biết. -v

Cập nhật /etc/ld.so.cache , liệt kê số phiên bản của mỗi thư

viện, quét các thư mục và bất kỳ liên kết mà được tạo ra hoặc cập nhật.

Các tu chn ca hàm idconfig

Biến môi trường và file cấu hình.

Chương trình tải (loader) và trình liên kết (linker) ld.so sử dụng 2 biến môi trường. Biến thứ nhất là $LD_LIBRARY, chứa danh sách các thư mục chứa các file thư viện được phân cách bởi dấu hai chấm để tìm ra các thư viện cần thiết khi chạy. Nó giống như biến môi trường $PATH. Biến môi trường thứ hai là $LD_PRELOAD, một danh sách các thư viện

được người dùng thêm vào được phân cách nhau bởi khoảng trống (space).

ld.so cũng cho phép sử dụng 2 file cấu hình mà có cùng mục đích với biến môi trường

được đề cập ở trên. File /etc/ld.so.conf chứa một danh sách các thư mục mà chương trình tải và trình liên kết (loader/linker) nên tìm kiếm các thư viện chia sẻ bên cạnh /usr/lib và /lib. /etc/ld.so.preload chứa danh sách các file thư viện được phân cách bằng một khoảng trống các thư viện này là thư viện người dùng tạo ra.

Một phần của tài liệu Laapj trình shell và lập trình C trên Linux (Trang 36 - 39)

Tải bản đầy đủ (PDF)

(41 trang)