Почему указатели кадров сохраняются в начале основной функции - PullRequest
2 голосов
/ 28 февраля 2020

Предположим, это C код:

int main(){
   return 0;
}

В сборке будет выглядеть так:

main:
    pushq   %rbp
    movq    %rsp, %rbp
    movl    $0, %eax
    popq    %rbp
    ret

Я знаю, что указатель кадра fp необходимо сохранить в начале функций на pushq %rbp, поскольку его необходимо восстановить при возврате к функции вызывающей стороны.

Мой вопрос: зачем это делать в main? что родительский абонент main? Разве fp не указывает на виртуальный адрес, то есть, когда main завершает адрес, это ничего не значит для следующей программы, верно?

Сохраняются ли значения fp (или даже sp) между разными программами и их адресным пространством?

1 Ответ

3 голосов
/ 28 февраля 2020

что является родительским вызывающим абонентом main?

В linux main вызывается __libc_start_main, в терминах вызывается _start, в windows I Я не очень уверен, но есть также _start.

На самом деле, хитрый трюк состоит в том, чтобы запустить программу C без main:

#include <stdio.h> 
#include <stdlib.h>

void _start() 
{  
    printf("No main function!\n");
    exit(0); 
} 

скомпилировать с:

gcc main.c -nostartfiles

Для Windows (10, г cc 8.1.0) и Ubuntu (18.04, г cc 9.2.0)

clang -Wl,-e,-Wl,__start main.c

Для MacOS (10.14 .6, Xcode 11.3)

Вот статья, в которой говорится о Linux x86 запуске программы

...