2009-08-06 31 views
101

Tôi có một đối tượng được chia sẻ (dll). Làm thế nào để tôi tìm hiểu tất cả các biểu tượng được xuất từ ​​đó?Làm cách nào để tìm hiểu tất cả các biểu tượng được xuất từ ​​một đối tượng được chia sẻ?

+1

Tất cả các biểu tượng trong đối tượng được xuất - ngay cả các hàm "nội bộ". Bạn chỉ cần khai báo chúng với trình biên dịch để chúng sẵn sàng cho trình liên kết. Điều này thường được thực hiện với một tập tin tiêu đề, như Ryan Fox nói dưới đây. –

+4

Chris Lutz bị nhầm lẫn: không phải tất cả các biểu tượng đều được xuất từ ​​các tệp đối tượng có thể định vị lại, ít hơn nhiều so với các thư viện được chia sẻ. –

+0

http://en.wikipedia.org/wiki/Nm_%28Unix%29 – PaulJWilliams

Trả lời

161

Bạn có "đối tượng được chia sẻ" (thường là thư viện được chia sẻ trên AIX), thư viện được chia sẻ UNIX hoặc tệp DLL Windows không? Đây là những điều tất cả khác nhau, và câu hỏi của bạn conflates tất cả :-(

  • Đối với một đối tượng AIX chia sẻ, sử dụng dump -Tv /path/to/foo.o.
  • Đối với một thư viện chia sẻ ELF, sử dụng readelf -Ws /path/to/libfoo.so, hoặc (nếu bạn có GNU nm) nm -D /path/to/libfoo.so.
  • Đối với một thư viện chia sẻ không ELF UNIX, xin vui lòng ghi rõ UNIX bạn quan tâm.
  • Đối với Windows DLL, sử dụng dumpbin /EXPORTS foo.dll.
+6

Trong GNU/Linux không có tiện ích như vậy «dumpbin». Và câu hỏi được gắn thẻ là linux. –

+2

Rất hữu ích, tốt để có tổng quan như vậy. 'nm' cũng hoạt động trên MacOSX, ngoại trừ tùy chọn' -D'. Hoặc 'brew install binutils' và sử dụng phiên bản GNU thông qua' gnm'.Đối với GNU 'nm',' --demangle' cũng hữu ích. Ngoài ra 'gobjdump'. – Albert

+0

Trên thực tế, bạn có thể làm việc cả với thư viện, dll và đối tượng được chia sẻ từ một tiện ích đơn thuần, [xem câu trả lời này] (https://stackoverflow.com/a/46772557/2388257). –

8

thấy man nm

GNU nm liệt kê những biểu tượng từ các tập tin đối tượng objfile .... Nếu không có đối tượng tập tin được liệt kê như là đối số, nm giả file a.out.
+7

btw: đối với các đối tượng được chia sẻ, bạn cần tùy chọn -D/- động. ví dụ. nm -D libmagic.so – VolkerK

0

Thông thường, bạn cũng sẽ có tệp tiêu đề mà bạn đưa vào mã để truy cập các ký hiệu.

19

objdump là một trong những tốt trên Linux.

+0

Cũng có sẵn trên AIX – pitseeker

11

Trên nm kiểm tra * nix. Trên cửa sổ sử dụng chương trình Dependency Walker

+2

Cụ thể, 'nm --defined-only -g something.so' sẽ in các ký hiệu vừa được xác định trong thư viện và các biểu tượng bên ngoài, mà có lẽ là những gì OP muốn. –

6

Sử dụng: nm --demangle <libname>.so

+1

'nm: /usr/lib/i386-linux-gnu/libtemplates_parser.so.11.6: không có ký hiệu'. cờ 'readelf' hoặc' -D' hoạt động. –

10

Nếu nó là một file Windows DLL và hệ điều hành của bạn là Linux sau đó sử dụng winedump:

$ winedump -j export pcre.dll 

Contents of pcre.dll: 229888 bytes 

Exports table: 

    Name:   pcre.dll 
    Characteristics: 00000000 
    TimeDateStamp: 53BBA519 Tue Jul 8 10:00:25 2014 
    Version:   0.00 
    Ordinal base: 1 
    # of functions: 31 
    # of Names:  31 
Addresses of functions: 000375C8 
Addresses of name ordinals: 000376C0 
Addresses of names: 00037644 

    Entry Pt Ordn Name 
    0001FDA0  1 pcre_assign_jit_stack 
    000380B8  2 pcre_callout 
    00009030  3 pcre_compile 
... 
3

Các cross-platform cách (không chỉ chéo - bản thân nền tảng, nhưng cũng làm việc, ít nhất, với cả hai *.so*.dll) đang sử dụng reverse-engineering framework radare2. Ví dụ:

$ rabin2 -s glew32.dll | head -n 5 
[Symbols] 
vaddr=0x62afda8d paddr=0x0005ba8d ord=000 fwd=NONE sz=0 bind=GLOBAL type=FUNC name=glew32.dll___GLEW_3DFX_multisample 
vaddr=0x62afda8e paddr=0x0005ba8e ord=001 fwd=NONE sz=0 bind=GLOBAL type=FUNC name=glew32.dll___GLEW_3DFX_tbuffer 
vaddr=0x62afda8f paddr=0x0005ba8f ord=002 fwd=NONE sz=0 bind=GLOBAL type=FUNC name=glew32.dll___GLEW_3DFX_texture_compression_FXT1 
vaddr=0x62afdab8 paddr=0x0005bab8 ord=003 fwd=NONE sz=0 bind=GLOBAL type=FUNC name=glew32.dll___GLEW_AMD_blend_minmax_factor 

Như một phần thưởng, rabin2 nhận C++ tên mangling, ví dụ (và cũng với .so tập tin):

$ rabin2 -s /usr/lib/libabw-0.1.so.1.0.1 | head -n 5 
[Symbols] 
vaddr=0x00027590 paddr=0x00027590 ord=124 fwd=NONE sz=430 bind=GLOBAL type=FUNC name=libabw::AbiDocument::isFileFormatSupported 
vaddr=0x0000a730 paddr=0x0000a730 ord=125 fwd=NONE sz=58 bind=UNKNOWN type=FUNC name=boost::exception::~exception 
vaddr=0x00232680 paddr=0x00032680 ord=126 fwd=NONE sz=16 bind=UNKNOWN type=OBJECT name=typeinfoforboost::exception_detail::clone_base 
vaddr=0x00027740 paddr=0x00027740 ord=127 fwd=NONE sz=235 bind=GLOBAL type=FUNC name=libabw::AbiDocument::parse 

trình với đối tượng tập tin quá:

$ g++ test.cpp -c -o a.o 
$ rabin2 -s a.o | head -n 5 
Warning: Cannot initialize program headers 
Warning: Cannot initialize dynamic strings 
Warning: Cannot initialize dynamic section 
[Symbols] 
vaddr=0x08000149 paddr=0x00000149 ord=006 fwd=NONE sz=1 bind=LOCAL type=OBJECT name=std::piecewise_construct 
vaddr=0x08000149 paddr=0x00000149 ord=007 fwd=NONE sz=1 bind=LOCAL type=OBJECT name=std::__ioinit 
vaddr=0x080000eb paddr=0x000000eb ord=017 fwd=NONE sz=73 bind=LOCAL type=FUNC name=__static_initialization_and_destruction_0 
vaddr=0x08000134 paddr=0x00000134 ord=018 fwd=NONE sz=21 bind=LOCAL type=FUNC name=_GLOBAL__sub_I__Z4funcP6Animal 
Các vấn đề liên quan