Почему состояние измененного указателя стека моей тестовой программы отличается от поведения в Linux в posix uefi?Linux

Ответить Пред. темаСлед. тема
Anonymous
 Почему состояние измененного указателя стека моей тестовой программы отличается от поведения в Linux в posix uefi?

Сообщение Anonymous »

Я создал небольшую тестовую программу, чтобы продемонстрировать:

Код: Выделить всё

#ifdef UEFI
#include "uefi/uefi.h"
#else
#include 
#include 
#include 
#endif

register void* rsp __asm__("rsp");

#define setsp(sp) __asm__("mov %0, %%rsp\n" \
: \
: "r" (sp))

#define getsp(sp) __asm__("mov %%rsp, %0\n" \
: "=r" (sp)\
: )

char* sp;
char* sp2;
char* sp3;
char* sp4;

int setstack(int a)
{
char* oldsp;
etsp(oldsp);
char* stack = malloc(2000);
memcpy(stack + 1000, oldsp, 64);
sp2 = stack + 1000;
setsp(sp2);
getsp(sp3);

printf("rsp in function %p\n", sp3);
printf("register rsp in function %p\n", rsp);
return 0;
}

int main(int argc, char** argv)
{
getsp(sp);
printf("rsp before function %p\n", sp);
printf("register rsp before function %p\n", rsp);
setstack(5);
getsp(sp4);
printf("rsp after function %p\n", sp4);
printf("register rsp after function %p\n", rsp);

while(1);

return 0;
}
В Linux я компилирую это так:

Код: Выделить всё

cc -fomit-frame-pointer test.c -o test
В Linux вывод:

Код: Выделить всё

rsp before function 0x7fff1f989a70
register rsp before function 0x7fff1f989a70
rsp in function 0x565084e6ba98
register rsp in function 0x565084e6ba98
rsp after function 0x565084e6bac8
register rsp after function 0x565084e6bac8
Я вижу, что в функции меняется стек, и после возврата из него он остается измененным с небольшим изменением на ret. Это то, что я ожидал.
В posix-uefi я компилирую это следующим образом:

Код: Выделить всё

clang -Wall -Wextra --ansi -O2 -DUEFI=1 -DELF64 -Wno-unused-parameter -fomit-frame-pointer -I./include -I/usr/include/x86_64-linux-gnu/ -fshort-wchar -fno-strict-aliasing -ffreestanding -fno-stack-protector -fno-stack-check -I. -I./uefi -I/usr/include -I/usr/include/efi -I/usr/include/efi/protocol -I/usr/include/efi/x86_64 -D__x86_64__ -DHAVE_USE_MS_ABI -mno-red-zone --target=x86_64-pc-win32-coff -Wno-builtin-requires-header -Wno-in compatible-library-redeclaration -Wno-long-long -c test.c -o test.o
lld -flavor link -subsystem:efi_application -nodefaultlib -dll -entry:uefi_init uefi/*.o test.o -out:testsp.efi
И я запускаю его в qemu (qemu-system-x86_64 -enable-kvm -m 2G -hda hda -bios /usr/share/OVMF/OVMF_CODE.fd -net none):

Код: Выделить всё

rsp before function 000000007fefa3a0
register rsp before function 000000007fefa3a0
rsp in function 000000007fefa3a0
register rsp in function 000000007df6b480
rsp after function 000000007fefa3a0
register rsp after function 000000007df6b480
Я вижу, что макрос getsp работает некорректно, и судя по переменной регистра, значение указателя стека в функции равно значению после него, как будто рет не было (эти значения немного отличаются при работе в Linux). Можете ли вы объяснить мне эти два пункта? Спасибо.

Подробнее здесь: https://stackoverflow.com/questions/791 ... iffer-from
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Linux»