Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Gcc 如何去除气体产生的看似不必要的零点?_Gcc_Assembly_X86_X86 64_Gnu Assembler - Fatal编程技术网

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