Các thông tin về kích thước chức năng được lưu trữ trong ELF Các thuộc tính cho ký hiệu tương ứng (tên). Mã ví dụ C cách phân tích cú pháp theo chương trình này ở dưới cùng của manpage Solaris cho gelf_getsym(3ELF)
(libelf không tồn tại trong Linux, * BSD và MacOS, bạn cần tìm trường st_size
của cấu trúc GElf_Sym
), nhưng bạn cũng có thể sử dụng objdump/elfdump (Solaris)/readelf (Linux) cho nhiệm vụ:
$ objdump -h -d --section=.text foo3.o
foo3.o: file format elf64-x86-64
Sections:
Idx Name Size VMA LMA File off Algn
0 .text 00000012 0000000000000000 0000000000000000 00000040 2**2
CONTENTS, ALLOC, LOAD, READONLY, CODE
[ ... ]
Disassembly of section .text:
0000000000000000 <foo>:
0: 55 push %rbp
1: 48 89 e5 mov %rsp,%rbp
4: 89 7d fc mov %edi,0xfffffffffffffffc(%rbp)
7: 89 75 f8 mov %esi,0xfffffffffffffff8(%rbp)
a: 8b 45 f8 mov 0xfffffffffffffff8(%rbp),%eax
d: 03 45 fc add 0xfffffffffffffffc(%rbp),%eax
10: c9 leaveq
11: c3 retq
này là dành cho một biên dịch được tối ưu hóa mã của bạn, trong khi phiên bản tối ưu hóa là:
$ objdump -h -d --section=.text foo3.o
foo3.o: file format elf64-x86-64
Sections:
Idx Name Size VMA LMA File off Algn
0 .text 00000004 0000000000000000 0000000000000000 00000040 2**4
CONTENTS, ALLOC, LOAD, READONLY, CODE
[ ... ]
Disassembly of section .text:
0000000000000000 <foo>:
0: 8d 04 37 lea (%rdi,%rsi,1),%eax
3: c3 retq
Note "Kích thước "thay đổi từ 0x12
thành 4
? Đó là những gì xuất phát từ chỉ thị lắp ráp .size
.
"Bí quyết" của việc cố gắng sử dụng lắp ráp nội tuyến để cung cấp cho bạn kích thước chức năng/vị trí mã không được tính toán cho mã trình tạo mã trình biên dịch (phần mở đầu chức năng/đoạn trích xuất, tạo mã nội tuyến, ...) đối với trình biên dịch sắp xếp lại trình biên dịch nội tuyến (gcc là khét tiếng để làm như vậy), do đó nó thường không phải là một ý tưởng tuyệt vời để tin tưởng điều này. Cuối cùng, nó phụ thuộc vào những gì chính xác bạn đang cố gắng để làm ...
Edit: Một vài tài liệu tham khảo hơn, bên ngoài cũng như trên stackoverflow:
- Từ danh sách gửi thư gcc, thread on
sizeof(function)
- what does sizeof (function name) return?
- Find size of a function in C
- LibELF by example dự án SourceForge (đây là tài liệu hướng dẫn/hướng dẫn)
Thật không may '__builtin_object_size' không hoạt động (ít nhất với gcc 4.7) –