Gcc 如何去除气体产生的看似不必要的零点?
我正在尝试创建一个真正最小的共享“库”,它的大小尽可能小:Gcc 如何去除气体产生的看似不必要的零点?,gcc,assembly,x86,x86-64,gnu-assembler,Gcc,Assembly,X86,X86 64,Gnu Assembler,我正在尝试创建一个真正最小的共享“库”,它的大小尽可能小: .text .globl test test: movb $1, %al movb $1, %dil movabs $message, %rsi movb $7, %dl syscall ret message: .ascii "hello" 编译时使用:gcc-o test.so-fPIC-shared-m64-nost
.text
.globl test
test:
movb $1, %al
movb $1, %dil
movabs $message, %rsi
movb $7, %dl
syscall
ret
message:
.ascii "hello"
编译时使用:gcc-o test.so-fPIC-shared-m64-nostlib-s-O3 test.s
而且输出仍然相对巨大:4.8KB!!
当我用radare查看二进制文件时,我可以看到在.text部分之后,有很多看起来不必要的代码洞产生了我的gas
;-- section_end..rela.dyn:
;-- section..text:
;-- test:
/ (fcn) entry0 20
| entry0 ();
| 0x00000268 b001 mov al, 1 ; [6] va=0x00000268 pa=0x00000268 sz=25 vsz=25 rwx=--r-x .text
| 0x0000026a 40b701 mov dil, 1
| 0x0000026d 48be7c020000. movabs rsi, 0x27c ; "hello" ; RELOC 64
| 0x00000277 b207 mov dl, 7
| 0x00000279 0f05 syscall
\ 0x0000027b c3 ret
; DATA XREF from 0x0000026d (entry0)
0x0000027c 68656c6c6f push 0x6f6c6c65
;-- section_end..text:
0x00000281 0000 add byte [rax], al
0x00000283 0000 add byte [rax], al
0x00000285 0000 add byte [rax], al
;-- section..eh_frame:
;-- section_end..eh_frame:
;-- section_end.LOAD0:
0x00000287 ~ 0000 add byte [rax], al
0x00000289 0000 add byte [rax], al
0x0000028b 0000 add byte [rax], al
0x0000028d 0000 add byte [rax], al
0x0000028f 0000 add byte [rax], al
0x00000291 0000 add byte [rax], al
............ and so on, wasting lots of kilobytes......
这些是干什么用的,我怎样才能摆脱它们(如果我可以/应该的话)?可能取决于工具链版本,对我来说是1864字节。使用
lea消息(%rip),%rsi
和-Wl,--buildid=none
使其更小。总的来说,不管怎样,低于4k都没有什么意义。您可能可以使用objcopy
或编译器标志删除一些其他部分。您能告诉我有关这些编译器标志的更多信息吗?我已经完成了objcopy,但只能删除eh_框架,删除任何其他部分都很可能导致导出函数的调用错误和/或segfaults,这是为了优化和/或二进制兼容性目的而添加的填充。你为什么要摆脱它?使代码更小的动机是什么?最大化,我被教导编写超快速和超小的代码,即使这样会降低可移植性。现在的人们做的恰恰相反,多平台:D