Почему ничего не выводится с оптимизацией GCC?

Без оптимизации всё работает, но даже с -O1 перестаёт.

void _start()
{
    char msg[] = "Hello!\n";
    write(1, msg, sizeof(msg));
    exit(0);
} 

В случае без оптимизации загружается 2 секции с размерами 8192 байта и 12 байт (в памяти 4096), а с оптимизацией 2 секции по 4096 байт. Аргументы к sys_write получаются одинаковыми, текст лежит на стеке. Но без оптимизации "Hello!" выводится, а с ней нет. Что может быть не так? Доступ к адресам стека есть, никаких ошибок страниц не вылетает.введите сюда описание изображения

usrlinker.ld:

ENTRY(_start)
SECTIONS
{
    .text 0x40000000 :
    {
        *(.text)
        . = ALIGN(4096);
    }
    .data :
    {
        *(.data)
        *(.rodata)
        . = ALIGN(4096);
    }
    .bss :
    {
        *(.bss)
        . = ALIGN(4096);
    }
}
uintptr_t stack_va = user_phvmap(proc, 0xf0000000 - PAGE_SIZE * 4, 4);
/* ... */
thrd->state.esp = stack_va + PAGE_SIZE * 4;
STACK_PUSHL(thrd->state.esp, user_thread_return); /* addr -= 4; *(uint32_t *)addr = val */
4000002a <_start>:
4000002a:       f3 0f 1e fb             endbr32
4000002e:       53                      push   %ebx
4000002f:       83 ec 10                sub    $0x10,%esp
40000032:       bb 01 00 00 00          mov    $0x1,%ebx
40000037:       8d 4c 24 08             lea    0x8(%esp),%ecx
4000003b:       b8 04 00 00 00          mov    $0x4,%eax
40000040:       ba 08 00 00 00          mov    $0x8,%edx
40000045:       cd 80                   int    $0x80
40000047:       89 d8                   mov    %ebx,%eax
40000049:       bb 00 00 00 00          mov    $0x0,%ebx
4000004e:       cd 80                   int    $0x80
40000050:       66 90                   xchg   %ax,%ax
ещё огромная куча xchg %ax, %ax

400010a8 <.data>:
        ...

без оптимизации:
4000009b <_start>:
4000009b:       f3 0f 1e fb             endbr32
4000009f:       55                      push   %ebp
400000a0:       89 e5                   mov    %esp,%ebp
400000a2:       83 ec 10                sub    $0x10,%esp
400000a5:       e8 56 0f 00 00          call   40001000 <__x86.get_pc_thunk.ax>
400000aa:       05 56 1f 00 00          add    $0x1f56,%eax
400000af:       c7 45 f8 48 65 6c 6c    movl   $0x6c6c6548,-0x8(%ebp)
400000b6:       c7 45 fc 6f 21 0a 00    movl   $0xa216f,-0x4(%ebp)
400000bd:       6a 08                   push   $0x8
400000bf:       8d 45 f8                lea    -0x8(%ebp),%eax
400000c2:       50                      push   %eax
400000c3:       6a 01                   push   $0x1
400000c5:       e8 88 ff ff ff          call   40000052 <write>
400000ca:       83 c4 0c                add    $0xc,%esp
400000cd:       6a 00                   push   $0x0
400000cf:       e8 a6 ff ff ff          call   4000007a <exit>
400000d4:       66 90                   xchg   %ax,%ax

Ответы (0 шт):