2012-01-24 23 views
5

Nếu tôi chạy objdump -d trên tập tin .o (linux amd64) .o, các cuộc gọi chức năng sẽ hiển thị mà không có độ phân giải thời gian liên kết được thực hiện. Ví dụ:objdump và giải quyết liên kết của các cuộc gọi chức năng cục bộ?

90: 66 89 44 24 1c   mov %ax,0x1c(%rsp) 
    95: 44 89 74 24 10   mov %r14d,0x10(%rsp) 
    9a: e8 00 00 00 00   callq 9f <foo+0x9f> 
    9f: 83 f8 ff    cmp $0xffffffffffffffff,%eax 
    a2: 74 5e     je  102 <foo+0x102> 

Chi nhánh trong phạm vi chức năng xuất hiện đúng cách, nhưng callq chỉ là sơ khai đưa vào cho các mối liên kết (với bốn byte số không có sẵn cho các mối liên kết để đặt một địa chỉ thích hợp vào).

Có cách nào, mà không thực sự liên kết, để có danh sách lắp ráp có tên chức năng được giải quyết không? Tôi không quan tâm đến địa chỉ mà cuối cùng sẽ được sử dụng, chỉ cần tên của hàm. Thông tin đó phải nằm trong tệp .o, vì trình liên kết phải tiêu thụ nó để thực hiện công việc của nó.

Tôi hỏi vì lib được chia sẻ mà mã được đề cập đến là khoảng 140Mb và phải mất thời gian dài để chạy objdump -d trên đó để có được kết xuất asm với tất cả các cuộc gọi hàm được giải quyết cho thực tế của chúng tên.

+0

tôi đã tìm ra một cách giải quyết cho vấn đề cụ thể của tôi. Tôi có thể chạy nm để lấy địa chỉ hàm trong lib chia sẻ lớn của chúng ta, và sau đó chạy objdump với --start-address bằng cách sử dụng đầu ra nm đó. Tôi vẫn muốn được trả lời câu hỏi gốc mặc dù nếu có thể. –

Trả lời

12

Có cách nào, mà không thực sự liên kết, để có danh sách lắp ráp có tên chức năng được giải quyết không?

Có: sử dụng objdump -dr foo.o

Các vấn đề liên quan