Сценарий компоновщика - счетчик местоположений и разделы сброса - PullRequest
1 голос
/ 09 февраля 2020

Я слежу за этой программой загрузочного сектора hello-world, которая имеет следующий скрипт компоновщика:

ENTRY(mystart)
SECTIONS
{
  . = 0x7c00;
  .text : {
    entry.o(.text)
    *(.text)
    *(.data)
    *(.rodata)
    __bss_start = .;
    *(.bss)
    *(COMMON)
    __bss_end = .;
  }

  .sig : AT(ADDR(.text) + 512 - 2)
  {
      SHORT(0xaa55);
  }
  /DISCARD/ : {
    *(.eh_frame)
  }
  __stack_bottom = .;
  . = . + 0x1000;
  __stack_top = .;
}

Ниже следует entry.S:

.code16
.text
.global mystart
mystart:
    ljmp $0, $.setcs
.setcs:
    xor %ax, %ax
    mov %ax, %ds
    mov %ax, %es
    mov %ax, %ss
    mov $__stack_top, %esp
    cld
    call main

Ниже приведена функция main

void main(void) {
    int i;
    char s[] = {'h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd'};
    for (i = 0; i < sizeof(s); ++i) {
        __asm__ (
            "int $0x10" : : "a" ((0x0e << 8) | s[i])
        );
    }
    while (1) {
        __asm__ ("hlt");
    };
}

Я ожидал, что __stack_top примет значение 0x8E00 (0x7C00 + 0x200 (512 байт загрузочного сектора) + 0x1000 (стек 4 КБ)), но когда я проверяю программу в gdb, инструкция

mov $__stack_top, %esp

толкает 0x8c93 в% esp.

Почему это происходит? eh_frame влияет как-то или я что-то здесь упускаю? Пожалуйста, помогите.

...