Error[8]: Undefined offset: 4, File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 121
File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 473, decode(

概述我正在为课程作业进行堆叠式练习,我已完成作业,但有一个方面我不明白.这是目标计划:#include <stdio.h> #include <stdlib.h>

我正在为课程作业进行堆叠式练习,我已完成作业,但有一个方面我不明白.

这是目标计划:

#include 

以下是在运行Ubuntu 12.04且禁用ASLR的x86虚拟机上编译它的命令.

gcc -ggdb -m32 -g -std=c99 -D_GNU_SOURCE -fno-stack-protector  -m32  target1.c   -o target1execstack -s target1

当我在堆栈上查看该程序的内存时,我看到buf的地址为0xbffffc40.此外,保存的帧指针存储在0xbffffd48,返回地址存储在0xbffffd4c.

这些特定地址不相关,但我观察到即使buf只有256长度,距离0xbffffd48 – 0xbffffc40 = 264.符号上,这个计算是$fp – buf.

为什么buf的结尾和堆栈中存储的帧指针之间有8个额外的字节?

这是函数foo的一些反汇编.我已经检查了它,但我没有看到该内存区域的任何明显用法,除非它是隐含的(即某些指令的副作用).

   0x080484ab <+0>:     push   %ebp                       0x080484ac <+1>:     mov    %esp,%ebp                  0x080484ae <+3>:     sub    -mpreferred-stack-boundary=2x118,%esp                0x080484b4 <+9>:     mov    0x8(%ebp),%eax             0x080484b7 <+12>:    add    [+++]x4,%eax                  0x080484ba <+15>:    mov    (%eax),%eax                0x080484bc <+17>:    lea    -0x108(%ebp),%edx          0x080484c2 <+23>:    mov    %edx,0x4(%esp)             0x080484c6 <+27>:    mov    %eax,(%esp)                0x080484c9 <+30>:    call   0x804848c 
最佳答案Basile Starynkevitch因提及对齐而获奖.

事实证明,gcc 4.7.2默认将帧边界与4字边界对齐.在32位仿真硬件上,即16字节.由于保存的帧指针和保存的指令指针一起只占用8个字节,编译器在buf结束后再放入8个字节,使堆栈帧的顶部与16字节边界对齐.

使用以下附加编译器标志,8个字节消失,因为8个字节足以对齐2个字的边界.

[+++]
总结

以上是内存溢出为你收集整理的c – 为什么缓冲区末尾和保存的帧指针之间有8个字节?全部内容,希望文章能够帮你解决c – 为什么缓冲区末尾和保存的帧指针之间有8个字节?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

)
File: /www/wwwroot/outofmemory.cn/tmp/route_read.php, Line: 126, InsideLink()
File: /www/wwwroot/outofmemory.cn/tmp/index.inc.php, Line: 166, include(/www/wwwroot/outofmemory.cn/tmp/route_read.php)
File: /www/wwwroot/outofmemory.cn/index.php, Line: 30, include(/www/wwwroot/outofmemory.cn/tmp/index.inc.php)
Error[8]: Undefined offset: 5, File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 121
File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 473, decode(

概述我正在为课程作业进行堆叠式练习,我已完成作业,但有一个方面我不明白.这是目标计划:#include <stdio.h> #include <stdlib.h>

我正在为课程作业进行堆叠式练习,我已完成作业,但有一个方面我不明白.

这是目标计划:

#include 

以下是在运行Ubuntu 12.04且禁用ASLR的x86虚拟机上编译它的命令.

gcc -ggdb -m32 -g -std=c99 -D_GNU_SOURCE -fno-stack-protector  -m32  target1.c   -o target1execstack -s target1

当我在堆栈上查看该程序的内存时,我看到buf的地址为0xbffffc40.此外,保存的帧指针存储在0xbffffd48,返回地址存储在0xbffffd4c.

这些特定地址不相关,但我观察到即使buf只有256长度,距离0xbffffd48 – 0xbffffc40 = 264.符号上,这个计算是$fp – buf.

为什么buf的结尾和堆栈中存储的帧指针之间有8个额外的字节?

这是函数foo的一些反汇编.我已经检查了它,但我没有看到该内存区域的任何明显用法,除非它是隐含的(即某些指令的副作用).

   0x080484ab <+0>:     push   %ebp                       0x080484ac <+1>:     mov    %esp,%ebp                  0x080484ae <+3>:     sub    -mpreferred-stack-boundary=2x118,%esp                0x080484b4 <+9>:     mov    0x8(%ebp),%eax             0x080484b7 <+12>:    add    x4,%eax                  0x080484ba <+15>:    mov    (%eax),%eax                0x080484bc <+17>:    lea    -0x108(%ebp),%edx          0x080484c2 <+23>:    mov    %edx,0x4(%esp)             0x080484c6 <+27>:    mov    %eax,(%esp)                0x080484c9 <+30>:    call   0x804848c 
最佳答案Basile Starynkevitch因提及对齐而获奖.

事实证明,gcc 4.7.2默认将帧边界与4字边界对齐.在32位仿真硬件上,即16字节.由于保存的帧指针和保存的指令指针一起只占用8个字节,编译器在buf结束后再放入8个字节,使堆栈帧的顶部与16字节边界对齐.

使用以下附加编译器标志,8个字节消失,因为8个字节足以对齐2个字的边界.

[+++]
总结

以上是内存溢出为你收集整理的c – 为什么缓冲区末尾和保存的帧指针之间有8个字节?全部内容,希望文章能够帮你解决c – 为什么缓冲区末尾和保存的帧指针之间有8个字节?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

)
File: /www/wwwroot/outofmemory.cn/tmp/route_read.php, Line: 126, InsideLink()
File: /www/wwwroot/outofmemory.cn/tmp/index.inc.php, Line: 166, include(/www/wwwroot/outofmemory.cn/tmp/route_read.php)
File: /www/wwwroot/outofmemory.cn/index.php, Line: 30, include(/www/wwwroot/outofmemory.cn/tmp/index.inc.php)
c– 为什么缓冲区末尾和保存的帧指针之间有8个字节?_系统运维_内存溢出

c– 为什么缓冲区末尾和保存的帧指针之间有8个字节?

c– 为什么缓冲区末尾和保存的帧指针之间有8个字节?,第1张

概述我正在为课程作业进行堆叠式练习,我已完成作业,但有一个方面我不明白.这是目标计划:#include <stdio.h> #include <stdlib.h>

我正在为课程作业进行堆叠式练习,我已完成作业,但有一个方面我不明白.

这是目标计划:

#include 

以下是在运行Ubuntu 12.04且禁用ASLR的x86虚拟机上编译它的命令.

gcc -ggdb -m32 -g -std=c99 -D_GNU_SOURCE -fno-stack-protector  -m32  target1.c   -o target1execstack -s target1

当我在堆栈上查看该程序的内存时,我看到buf的地址为0xbffffc40.此外,保存的帧指针存储在0xbffffd48,返回地址存储在0xbffffd4c.

这些特定地址不相关,但我观察到即使buf只有256长度,距离0xbffffd48 – 0xbffffc40 = 264.符号上,这个计算是$fp – buf.

为什么buf的结尾和堆栈中存储的帧指针之间有8个额外的字节?

这是函数foo的一些反汇编.我已经检查了它,但我没有看到该内存区域的任何明显用法,除非它是隐含的(即某些指令的副作用).

   0x080484ab <+0>:     push   %ebp                       0x080484ac <+1>:     mov    %esp,%ebp                  0x080484ae <+3>:     sub    -mpreferred-stack-boundary=2x118,%esp                0x080484b4 <+9>:     mov    0x8(%ebp),%eax             0x080484b7 <+12>:    add    x4,%eax                  0x080484ba <+15>:    mov    (%eax),%eax                0x080484bc <+17>:    lea    -0x108(%ebp),%edx          0x080484c2 <+23>:    mov    %edx,0x4(%esp)             0x080484c6 <+27>:    mov    %eax,(%esp)                0x080484c9 <+30>:    call   0x804848c 
最佳答案Basile Starynkevitch因提及对齐而获奖.

事实证明,gcc 4.7.2默认将帧边界与4字边界对齐.在32位仿真硬件上,即16字节.由于保存的帧指针和保存的指令指针一起只占用8个字节,编译器在buf结束后再放入8个字节,使堆栈帧的顶部与16字节边界对齐.

使用以下附加编译器标志,8个字节消失,因为8个字节足以对齐2个字的边界.

          总结       

以上是内存溢出为你收集整理的c – 为什么缓冲区末尾和保存的帧指针之间有8个字节?全部内容,希望文章能够帮你解决c – 为什么缓冲区末尾和保存的帧指针之间有8个字节?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://www.outofmemory.cn/yw/1050238.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-25
下一篇 2022-05-25

发表评论

登录后才能评论

评论列表(0条)