я составил на Slackware 14 (32 бит) следующие примеры программ:памяти в Linux - система() поведение
// p1.c
#include <stdio.h>
unsigned char *sp() { asm("movl %esp, %eax\n\taddl $8, %eax"); }
int main(int argc, char **argv)
{
char *s1="1111111111";
printf("p1: s1=%p, SP=%p\n", s1, sp());
system("./p2.bin");
printf("p1: s1=%p, SP=%p\n", s1, sp());
}
// p2.c
#include <stdio.h>
unsigned char *sp() { asm("movl %esp, %eax\n\taddl $8, %eax"); }
int main(int argc, char **argv)
{
char *s2="2222222222";
printf("p2: s2=%p, SP=%p\n", s2, sp());
}
ESP печатных значений были идентичны:
bash-4.2$ ./p1.bin
p1: s1=0x8048580, SP=0xbffff6b0
p2: s2=0x8048530, SP=0xbffff6b0
p1: s1=0x8048580, SP=0xbffff6b0
Но я ожидал, что разные, потому что кадр стека основной функции p2 должен быть выделен поверх фрейма стека основной функции p1. Что не так?
Другой вопрос:
Если я изменяю p2.c сбросить память из 0x8048580 я могу видеть «2222222222» (в настоящее время addrress 0x80486f0), но не «1111111111» в 0x8048580. Зачем?
Благодарим за помощь.
Большое спасибо – user2431763