gpt4 book ai didi

c - Linux 中的内存布局 - system() 行为

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:38:41 25 4
gpt4 key购买 nike

我在 Slackware 14(32 位)上编译了以下示例程序:

// 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 main 函数的堆栈帧应该分配在 p1 main 函数的堆栈帧之上。怎么了?

另一个问题:
如果我修改 p2.c 以从 0x8048580 转储内存,我可以看到“2222222222”(现在地址为 0x80486f0),但在 0x8048580 看不到“1111111111”。为什么?
感谢您的帮助。

最佳答案

p2 是一个完全不同的过程。它不是“分配在 p1 之上”。即使地址相同,它们实际上指的是不同的物理内存位置。这一切都被虚拟内存和 CPU 的 MMU 隐藏了。

值相同的原因与 linux 加载可执行文件的方式有关。不要指望它们总是一样的。

关于c - Linux 中的内存布局 - system() 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20314278/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com