assembly NASM elf文件大小与部分中大写字母和小写字母的差异

t5zmwmid  于 2022-11-13  发布在  其他
关注(0)|答案(1)|浏览(163)

我在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被声明为不区分大小写的编译器。那么有什么区别呢?

v64noz0r

v64noz0r1#

您可以自由地为ELF节使用任何您喜欢的名称,但是如果您不使用标准名称,则指定节标志将成为您的责任。(如果您使用标准名称,则可以利用这些名称的默认标志设置。)部分名称区分大小写,NASM可以识别.data.text.DATA.dAta等则不能识别,并且没有任何东西将这些部分彼此区分开,从而允许ld将它们合并成单个片段。
这会自动使可执行文件变小。使用.text.data的标准标志,其中一个是只读的,另一个是读写的,这意味着它们不能放在同一个内存页中。在示例程序中,这两个部分都很小,因此它们可以放在一个内存页中。因此,使用非标准名称会使可执行文件变小一页。但是其中一个部分将具有不正确的可写性。

相关问题