【问题标题】:NASM elf file size difference with uppercase and lowercase letters in sectionNASM elf 文件大小差异与节中的大写和小写字母
【发布时间】:2022-08-19 19:39:11
【问题描述】:

我在 debian linux 下用汇编写了一个简单的“Hello world”:

; Define variables in the data section
SECTION .data
    hello:     db \'Hello world!\',10
    helloLen:  equ $-hello

; Code goes in the text section
SECTION .text
GLOBAL _start 

_start:
    mov eax,4            ; \'write\' system call = 4
    mov ebx,1            ; file descriptor 1 = STDOUT
    mov ecx,hello        ; string to write
    mov edx,helloLen     ; length of string to write
    int 80h              ; call the kernel

    ; Terminate program
    mov eax,1            ; \'exit\' system call
    mov ebx,0            ; exit with error code 0
    int 80h              ; call the kernel

组装后

nasm -f elf64 hello.asm -o hello.o
ld -o hello hello.o.

我有一个9048字节二进制。

然后我在代码中更改了两行:从.data.DATA.text.TEXT

SECTION .DATA
SECTION .TEXT

并得到了一个4856字节二进制。
将它们更改为

SECTION .dAtA
SECTION .TeXt

制作了一个4856字节二进制也是。

NASM 被声明为不区分大小写的编译器。那有什么区别呢?

  • NASM 肯定是不是不区分大小写。

标签: linux assembly compiler-construction nasm binary-size


【解决方案1】:

您可以随意为 ELF 部分使用任何您喜欢的名称,但如果您不使用标准名称,则指定部分标志成为您的责任。 (如果您使用标准名称,您可以利用这些名称的默认标志设置。)部分名称区分大小写,并且 .data.text 是 NASM 已知的。 .DATA.dAta 等不是,并且没有什么可以将这些部分彼此区分开来,允许 ld 将它们组合成一个片段。

这会自动使您的可执行文件更小。对于.text.data 的标准标志,其中一个是只读的,另一个是读写的,这意味着它们不能放在同一个内存页中。在您的示例程序中,这两个部分都非常小,因此它们可以放在一个内存页中。因此,使用非标准名称会使您的可执行文件变小一页,但其中一个部分的可写性将不正确。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-04
    • 2011-04-03
    • 2011-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多