Làm thế nào để xem các ký hiệu trong tệp đối tượng?


81

Làm cách nào để xem các ký hiệu trong tệp .o? nm không làm việc cho tôi. Tôi sử dụng g ++ / linux.


5
nm là chính xác những gì bạn sẽ sử dụng. Bạn có thể giải thích làm thế nào nó không hoạt động cho bạn?
nos

1
Nó nói:nm: Lib1.o: File format not recognized
nakiya

4
@nakiya: Chạy file Lib1.ovà cho chúng tôi biết đầu ra là gì.
DarkDust

4
@nakiya Bạn không thể chạy tệp .o. Và nếu bạn biên dịch tệp tiêu đề, bạn tạo tiêu đề được biên dịch trước với các phiên bản gcc gần đây, không phải tệp đối tượng. Bạn nên biên dịch tệp .cpp không phải tệp tiêu đề.
nos

1
@nakiya: Bạn không thể chạy nó, bạn thực sự nên nhập văn bản " file Lib1.o" vào trình bao của mình. Công cụ được gọi filecho bạn biết loại tệp của Lib1.o, đó là liệu nó có thực sự là tệp đối tượng hay không. Tôi nghi ngờ điều đó.
DarkDust

Câu trả lời:


100

Thay vì nm, bạn có thể sử dụng quyền lực objdump. Xem trang người đàn ông để biết chi tiết. Hãy thử objdump -t myfilehoặc objdump -T myfile. Với -Ccờ, bạn cũng có thể gỡ bỏ các tên C ++, giống như nmvậy.


1
Tôi cũng đã thử ObjDump. Cùng một kết quả:objdump: Lib1.o: File format not recognized
nakiya

2
thửobjdump -t Lib1.o
mustafa

13

Bạn đã sử dụng trình biên dịch chéo cho một nền tảng khác chưa? Nếu vậy, bạn cần phải sử dụng tương ứng nmhoặcobjdump .

Ví dụ: nếu bạn đã sử dụng XXX-YYY-gccđể biên dịch tệp .o, bạn cần sử dụng XXX-YYY-nmhoặc XXX-YYY-objdumpđể xử lý tệp.



4

Có một lệnh để xem các hàm nào được bao gồm trong tệp đối tượng hoặc thư viện hoặc tệp thực thi:

nm

4
OP đã tuyên bố thẳng rằng anh ta không thể sử dụng nm.
ivan_pozdeev

2

Bạn có thể sử dụng nm -C .o/lib/exe, ví dụ:

xiongyu@ubuntu:~/tmp/build$ nm -C libfile1.a 

file1.cpp.o:
0000000000000000 T f()
0000000000000000 W int fun<int>(int)

bằng cách sử dụng nm -Cnó sẽ dễ đọc hơn , nếu bạn chỉ sử dụng nm:

xiongyu@ubuntu:~/tmp/build$ nm libfile1.a 

file1.cpp.o:
0000000000000000 T _Z1fv
0000000000000000 W _Z3funIiET_S0_

như chúng tôi thấy nó không dễ đọc.

Dưới đây là những gì tôi file1.cppthích:

xiongyu@ubuntu:~/tmp/build$ vi ../file1.cpp 
#include "head.h"
void f()  {
     int i = fun<int>(42);
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.