Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C++

Liệt kê tất cả symbol trong file .so (shared library) trên Linux

Để 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ục
  • t – hàm/static cục bộ
  • D/d – dữ liệu toàn cục/động
  • B/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 static hoặc ẩn (visibility hidden) không hiện với nm -g – dùng nm -a hoặc readelf -Ws.
  • C++ mangling: dùng c++filt hoặc nm -C để đọc tên gốc.
  • Windows (.dll): dùng dumpbin /exports hoặc Dependency Walker.