Để kiểm tra các symbol (hàm, biến toàn cục) xuất khẩu trong file thư viện động .so (ELF format), dùng các công cụ dòng lệnh chuẩn.
1. nm – Công cụ tiêu chuẩn liệt kê symbol
nm -g libName.so # Chỉ symbol toàn cục (exported) nm -D libName.so # Symbol động (dynamic symbol table) nm -C libName.so # Demangle tên C++ (đọc dễ hiểu) nm -gC libName.so # Kết hợp: global + demangle
Ký hiệu phổ biến:
T– hàm/text (code) toàn cụct– hàm/static cục bộD/d– dữ liệu toàn cục/độngB/b– BSS (chưa khởi tạo)U– undefined (cần link từ nơi khác)W/w– weak symbol
2. readelf – Chi tiết hơn, định dạng ELF
readelf -Ws libName.so # Bảng symbol (symbol table) chi tiết readelf -s libName.so # Gọn hơn readelf -d libName.so # Dynamic section (NEEDED, RPATH...)
3. objdump – Phân tích mã máy
objdump -T libName.so # Dynamic symbol table objdump -t libName.so # Symbol table thường
Ví dụ thực tế
$ nm -gC libmylib.so
0000000000001230 T MyClass::doSomething(int)
00000000000011a0 T my_global_function
0000000000003000 B my_global_var
U std::cout
U std::basic_ostream<char, std::char_traits<char> >::operator<<(int)
Lưu ý
- Symbol
statichoặc ẩn (visibility hidden) không hiện vớinm -g– dùngnm -ahoặcreadelf -Ws. - C++ mangling: dùng
c++filthoặcnm -Cđể đọc tên gốc. - Windows (.dll): dùng
dumpbin /exportshoặcDependency Walker.