Почему ничего не выводится с оптимизацией 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