Разница между "секцией" и "сегментом" в NASM
Я использую некоторые детские программы NASM, чтобы помочь мне выучить язык.
Из того, что я прочитал, программы NASM могут иметь три раздела;.data,.bss и .text, который является обязательным. Однако я часто нахожу, что иногда имена разделов section
, а иногда - segment
.
Например, с этим "Hello World", который я нашел в Интернете:
; hello.asm a first program for nasm for Linux, Intel, gcc
;
; assemble: nasm -f elf -l hello.lst hello.asm
; link: gcc -o hello hello.o
; run: hello
; output is: Hello World
SECTION .data ; data section
msg: db "Hello World",10 ; the string to print, 10=cr
len: equ $-msg ; "$" means "here"
; len is a value, not an address
SECTION .text ; code section
global main ; make label available to linker
main: ; standard gcc entry point
mov edx,len ; arg3, length of string to print
mov ecx,msg ; arg2, pointer to string
mov ebx,1 ; arg1, where to write, screen
mov eax,4 ; write sysout command to int 80 hex
int 0x80 ; interrupt 80 hex, call kernel
mov ebx,0 ; exit code, 0=normal
mov eax,1 ; exit command to kernel
int 0x80 ; interrupt 80 hex, call kernel
Если я изменил каждый экземпляр section
на segment
, он все равно будет работать.
Может кто-нибудь объяснить разницу между ними, если таковые имеются?
Ответы
Ответ 1
Из документации nasm:
Директива SECTION (СЕГМЕНТ - это точно эквивалентный синоним)
Nasm может производить вывод в различных форматах, некоторые из которых поддерживают разделы. Определенные имена разделов могут быть произвольными (например, три перечисленные вами), для них учитываются только флаги разделов. Предопределенные - это просто удобные сочетания, .text
помечен как содержащий код, .data
как инициализированные данные чтения и записи и .bss
как ноль-инициализированные данные для чтения-записи. Вы можете поместить свой код в раздел с именем foo
, если он был помечен как раздел кода, и вы можете использовать несколько разделов по своему усмотрению.
Ответ 2
Также стоит отметить, что вы можете определять свои собственные разделы с помощью специальных флагов (и изменять флаги в разделах по умолчанию), что является расширением elf к директиве section. Из документов:
Как и формат obj, elf позволяет вам указать дополнительную информацию в строке директивы SECTION, чтобы управлять типом и свойствами объявляемых вами разделов.
Например, вы можете создать раздел следующим образом:
section .special write
После сборки вы можете проверить его: readelf -S test.o
[3] .special PROGBITS 0000000000000000 00000250
0000000000000005 0000000000000000 WA 0 0 1