2012-04-01 24 views
30

Giả sử chúng ta có một thư viện chia sẻ tên libtest.so, có một chức năng "foo" trong đónm vs "readelf -s"

sử dụng dải để loại bỏ tất cả các biểu tượng từ libtest.so

$strip libtest.so 

như vậy, bây giờ nếu chúng ta sử dụng:

$nm libtest.so 

nó sẽ in ra:

nm: libtest.so: không có biểu tượng

nhưng nếu chúng ta sử dụng:

$readelf -s libtest.so 

chức năng foo vẫn có thể được nhìn thấy từ kết quả của nó:

...

10: 000005dc 5 FUNC GLOBAL DEFAULT 12 _Z3foov

...

chúng tôi cũng có thể sử dụng chuỗi lệnh để kiểm tra:

$strings libtest.so 

...

_Z3foov

...

đây là câu hỏi của tôi, tại sao nm cho không có kết quả cho libtest.so sọc?

Cảm ơn

Trả lời

48

tại sao nm cho không có kết quả cho sọc libtest.so

hai bảng biểu tượng trong bản gốc libtest.so: a "thường xuyên" một (trong .symtab.strtab phần) và động lực (trong các phần .dynsym.dynstr).

Nếu strip xóa cả hai bảng biểu tượng, thư viện của bạn sẽ hoàn toàn vô dụng: trình tải động không thể giải quyết bất kỳ biểu tượng nào trong đó. Vì vậy, strip là điều duy nhất có ý nghĩa: loại bỏ bảng biểu tượng "thông thường", để nguyên một nguyên vẹn.

Bạn có thể thấy các ký hiệu trong bảng ký hiệu động với nm -D hoặc readelf -s.

Bảng ký hiệu "thông thường" chỉ hữu ích để gỡ lỗi (ví dụ, nó chứa các mục nhập cho các hàm tĩnh, không được xuất bởi thư viện và không hiển thị trong bảng ký hiệu động).

Nhưng trình tải động không bao giờ xem bảng biểu tượng "thông thường" (không có định dạng phù hợp để tra cứu biểu tượng nhanh); chỉ ở động. Vì vậy, bảng biểu tượng "thường xuyên" là không cần thiết cho hoạt động chương trình chính xác, nhưng một trong những năng động là.

+1

Tên người dùng của bạn thật tuyệt vời.Vì vậy, về cơ bản, nếu tôi liên kết một thư viện tĩnh với một nhị phân lúc biên dịch, các biểu tượng của thư viện sẽ hiển thị bằng nm, nhưng nếu tôi liên kết động, các ký hiệu sẽ hiển thị trong chính sách -S và nm -D, đúng không? – acib708

+0

@ AlejandroCárdenas Tôi không tin rằng sự hiểu biết của bạn là khá chính xác. Ngoài ra, có sự khác biệt giữa 'readelf -s' và' readelf -S'. Có lẽ tốt hơn nên hỏi một câu hỏi riêng. –

+0

Vâng, xin lỗi, tôi có nghĩa là readelf -s. Vâng, câu hỏi cốt lõi vẫn còn, tôi không hiểu sự khác biệt giữa nm và readelf -s kể từ khi bạn cho tôi biết những gì tôi hiểu là không chính xác. Bạn sẽ quan tâm để xây dựng thêm một chút, xin vui lòng? – acib708