Нет сегмента стека? Это просто концепция? - PullRequest
1 голос
/ 21 марта 2019

Я провел несколько тестов и понял, что неправильно говорить, что сегмент стека существует, потому что когда я анализировал двоичный файл, я понял, что любой тип данных, который не находится ни в регистре, ни в статическом, глобальном или постоянномв текстовом сегменте.Вы согласны со мной по этому поводу?Я действительно сомневаюсь, я всегда думал, что было правильно вызывать сегменты кучи и стека памяти. Я знаю, что концепция существует, но не сегмент

Компиляция: gcc example.c -c

Пример: objdump -s example.o

#include <stdio.h>

int main(void) {

     char s[] = "string";
     return 0;
}

1 Ответ

4 голосов
/ 21 марта 2019

Вы, вероятно, ссылаетесь на это:

Содержание раздела .text:

0000 554889e5 c745f073 74726966 c745f46e UH ... E.strif.E.n

0010 67c645f6 00b80000 00005dc3 г.E .......].

Вы можете увидеть строку "string" в текстовом разделе, потому что это утверждение

char s[] = "string";

приводит к коду, который копирует строку в стек. objdump -d показывает

Разборка раздела .text:

0000000000000000 <main>:
   0:   55                      push   %rbp
   1:   48 89 e5                mov    %rsp,%rbp
   4:   c7 45 f0 73 74 72 69    movl   $0x69727473,-0x10(%rbp)
   b:   66 c7 45 f4 6e 67       movw   $0x676e,-0xc(%rbp)
...

Последние две инструкции перемещают «строку» в стеке, поскольку она работает с непосредственными значениями, которые вы можете увидеть в hexdump. Тем не менее, он живет в стеке во время выполнения.

...