2013-03-18 42 views
8

Tôi muốn biết chính xác có bao nhiêu mã đối tượng được GCC tạo ra cho mỗi bộ sưu tập các đơn vị biên dịch, nhưng tôi gặp vấn đề lạ khi lệnh "kích thước" từ các binutils không đưa ra kết quả chính xác.cách xác định kích thước mã đối tượng trên Linux khi "kích thước" đưa ra câu trả lời sai?

Chúng ta hãy tập C chỉ chứa chức năng này:

int foo (int a, int b) 
{ 
    return a+b; 
} 

Chúng tôi có thể biên dịch nó và kiểm tra kích thước mã đối tượng sử dụng cả "kích thước" và "objdump":

$ gcc -O foo.c -c 
$ size foo.o 
    text data  bss  dec  hex filename 
    52  0  0  52  34 foo.o 
$ objdump -d foo.o 

foo.o:  file format elf64-x86-64 


Disassembly of section .text: 

0000000000000000 <foo>: 
    0: 8d 04 37    lea (%rdi,%rsi,1),%eax 
    3: c3      retq 

Từ đầu ra objdump, rõ ràng là kích thước mã đối tượng là 4 byte. Tuy nhiên, kích thước báo cáo 52 byte, đó là không chính xác.

Từ việc sử dụng tùy chọn "-D" để objdump, có vẻ như mã xử lý ngoại lệ và có thể một số nội dung khác được đo bằng "kích thước" và được thêm vào kích thước của mã mà tôi thực sự quan tâm. Có ai biết một cách tương đối đơn giản để có được kích thước để bỏ qua những tính năng bổ sung?

+1

Cố gắng biên dịch lại với '-fno-ngoại lệ -fno-Thư giãn-tables' –

+0

Marat, không may các tùy chọn này dường như không có có hiệu lực, tệp .o hoàn toàn giống nhau. Đây là gcc 4.7.2 trên x86-64. Tôi sẽ xem xét một số tùy chọn bổ sung có thể thực hiện công việc ... –

+5

Aha, các tùy chọn này cùng nhau đưa ra kết quả mong muốn: -fno-exceptions -fno-unwind-tables -fno-asynchronous-unwind-tables –

Trả lời

0

Bạn có phải gắn bó với size không? Nó có nhiều vấn đề tương tự với những gì bạn chạy vào vì vậy tôi thường sử dụng đoạn mã này readelf:

OBJ=foo.o 
SEC=.text 

readelf -SW "$OBJ" \ 
    | sed 's/^ *\[[0-9 ]*\] *//' \ 
    | awk ' 
    /NOBITS/ { next; } 
    /^'$SEC'\>/ { sz = strtonum("0x" $5); s += sz; } 
    END { print s }' 
Các vấn đề liên quan