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?
Cố gắng biên dịch lại với '-fno-ngoại lệ -fno-Thư giãn-tables' –
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 ... –
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 –