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ẻ?
Trả lời
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õ mà UNIX bạn quan tâm.
- Đối với Windows DLL, sử dụng
dumpbin /EXPORTS foo.dll
.
Trong GNU/Linux không có tiện ích như vậy «dumpbin». Và câu hỏi được gắn thẻ là linux. –
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
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). –
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.
Trên nm kiểm tra * nix. Trên cửa sổ sử dụng chương trình Dependency Walker
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. –
Sử dụng: nm --demangle <libname>.so
'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. –
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
...
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
và *.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
- 1. Làm cách nào để xóa biểu tượng khỏi một đối tượng được chia sẻ?
- 2. Ẩn (các) biểu tượng trong đối tượng được chia sẻ từ LD
- 3. ràng buộc khi tự động tải một đối tượng được chia sẻ từ một đối tượng được chia sẻ khác?
- 4. Làm cách nào để tải một đối tượng được chia sẻ trong C++?
- 5. Tìm tất cả các đối tượng không có đối tượng has_many được liên kết
- 6. Đối tượng được chia sẻ Flash (nghĩa là cookie flash) không được chia sẻ với Chrome
- 7. Không thể mở tệp đối tượng được chia sẻ
- 8. Làm cách nào để chia sẻ một UIManagedDocument giữa các đối tượng khác nhau?
- 9. Cách chia sẻ biến trong thư viện đối tượng được chia sẻ
- 10. Làm thế nào để có được một đối tượng đại biểu từ một EventInfo?
- 11. Làm cách nào để lặp qua tất cả các khóa của tùy chọn được chia sẻ?
- 12. Trong GCC, làm cách nào tôi có thể xuất tất cả các biểu tượng typeinfo cho một thư viện được chia sẻ mà không xuất tất cả các ký hiệu?
- 13. Bao gồm đối tượng được chia sẻ trong assembly maven
- 14. Xuất tất cả các đối tượng trong node.js
- 15. Làm cách nào để có được tất cả các điểm giữa hai đối tượng Điểm?
- 16. Tìm hiểu các đối tượng trong Python
- 17. Chia sẻ các đối tượng trên các quy trình Java
- 18. Làm cách nào để liệt kê tất cả các đối tượng được tạo từ một lớp trong Ruby?
- 19. Cách lấy biểu tượng được liên kết từ tệp chia sẻ mạng
- 20. Trả về một thư viện chia sẻ biểu tượng bảng
- 21. Làm cách nào để tránh lỗi "biểu tượng trùng lặp" trong xcode với các thư viện tĩnh được chia sẻ?
- 22. Tôi làm cách nào để tìm tất cả các đối tượng tham chiếu myObject?
- 23. Làm thế nào để chia sẻ một đối tượng có chứa một filehandle?
- 24. Các đối tượng instantiating trong bộ nhớ chia sẻ C++
- 25. Chia sẻ một đối tượng được tuần tự hóa giữa các ứng dụng
- 26. Cách chia sẻ đối tượng giữa các ứng dụng java?
- 27. Làm tất cả các đối tượng kế thừa từ NSObject?
- 28. Tìm hiểu đối tượng nào đã được nhấp vào một html5 Canvas
- 29. Cách lấy danh sách tất cả các đối tượng? - PostgreSQL
- 30. Liên kết hai thư viện được chia sẻ với một số biểu tượng giống nhau
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. –
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ẻ. –
http://en.wikipedia.org/wiki/Nm_%28Unix%29 – PaulJWilliams