linux修改栈指针x86,x86-堆栈指针未填充16时libc的system()导致分段...

x86-64 System V ABI保证在调用之前进行16字节的堆栈对齐,因此,允许libc系统将其用于16字节的对齐加载/存储.如果您破坏了ABI,那么当事情崩溃时,这就是您的问题.

在进入某个函数时,在调用推送了一个返回地址之后,RSP -8会对齐16个字节,再按一次将使您可以调用另一个函数.

当然,通过使用奇数次压入或使用sub rsp,16 * n 8来保留堆栈空间,GCC当然通常没有问题.只要您仅读取变量而不分配变量,就可以将带有asm(“ rsp”)的register-asm局部变量与asm(“ rsp”)配合使用.

您说您正在使用GCC7.3. I put your code on the Godbolt compiler explorer并使用-O3,-O2,-O1和-O0进行编译.它在所有优化级别上都遵循ABI,使之成为以sub rsp,8开头的主函数,并且直到函数结束时才修改函数内部的RSP(调用除外).

我检查过的clang和gcc的所有其他版本和优化级别也是如此.

这是gcc7.3 -O3的代码源:请注意,除了在函数体内读取RSP以外,它对RSP均无任何作用,因此,如果使用有效的RSP(16字节对齐-8)调用main,则main的所有功能还将使用16字节对齐的RSP进行调用. (并且它永远不会发现sp& 8为真,因此它永远不会首先调用system.)

# gcc7.3 -O3

main:

sub rsp, 8

xor eax, eax

mov edi, OFFSET FLAT:.LC0

mov rsi, rsp # read RSP.

call printf

test spl, 8 # low 8 bits of RSP

je .L2

mov edi, OFFSET FLAT:.LC1

call puts

mov edi, OFFSET FLAT:.LC2

call system

.L2:

xor eax, eax

add rsp, 8

ret

如果您以某种非标准方式呼叫main,则违反了ABI.而且您不在问题中解释它,所以这不是MCVE.

正如我在Does the C++ standard allow for an uninitialized bool to crash a program?中所述,允许编译器发出利用目标平台ABI所做的任何保证的代码.这包括使用movaps进行16字节的加载/存储,以利用传入的对齐保证来在堆栈上复制内容.

gcc不能像clang那样完全优化if(),这是错过的优化.

但是clang确实将其视为未初始化的变量.我认为,它没有在asm语句中使用它,因此本地寄存器asm(“ rsp”)对clang无效. Clang在第一个printf调用之前不修改RSI,所以clang的main实际上打印argv,根本不读取RSP.

允许Clang执行此操作:register-asm本地vars唯一受支持的用法是使“ r”(var)Extended-asm约束选择所需的寄存器. (https://gcc.gnu.org/onlinedocs/gcc/Local-Register-Variables.html).

该手册并不意味着仅仅在其他时间使用这样的变量可能会有问题,因此我认为,根据书面规则,该代码通常应该是安全的,并且可以在实践中使用.

手册确实说过使用调用优先寄存器(如x86上的“ rcx”)会导致变量被函数调用所破坏,所以也许使用rsp的变量会受到编译器生成的push / pop的影响吗?

这是一个有趣的测试用例:在Godbolt链接上查看.

// gcc won't compile this: "error: unable to find a register to spill"

// clang simply copies the value back out of RDX before idiv

int sink;

int divide(int a, int b) {

register long long int dx asm ("rdx") = b;

asm("" : "+r"(dx)); // actually make the compiler put the value in RDX

sink = a/b; // IDIV uses EDX as an input

return dx;

}

没有asm(“”:“ r”(dx));, gcc会很好地进行编译,根本不会将b放入RDX中.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/560364.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

求余弦函数的近似值

题目要求 本题要求实现一个函数,用下列公式求cos(x)的近似值,精确到最后一项的绝对值小于e: cos(x)x​0​​ /0!−x​2​​ /2!x​4​​ /4!−x​6​​ /6!⋯ 函数接口定义: double funcos( double e, double x ); 其中用户传…

android xml怎么建立,androidXmlSerializer创建XML文件

要完成的样子如下张010作死0核心代码:private void serializer(FileOutputStream outputStream) {try {//构建解析器XmlSerializer xmlSerializer Xml.newSerializer();//输出文件流及编码格式xmlSerializer.setOutput(outputStream, "UTF-8");//xml声明及编码格式x…

Altium Designer20新建项目\导入库\绘制原理图\导入pcb\绘制pcb

1.新建项目 2.新建原理图和PCB 3.新建原理图库和pcb库 4.导入原理图库和pcb库 点击如图所示 然后点击安装,找到需要安装的位置,打开 然后在下拉框里就可以找到,并选择外部的库 5.绘制原理图 在Components里面选择一个库然后找元器件 然…

红魔1android版本能升到多少,红魔5G:实力全开,比快更快

红魔5G:实力全开,比快更快2020-03-20 20:37:090点赞0收藏0评论在当代年轻人的生活里,手游似乎已经成为必不可少的一部分:心情不好来一局、初次见面来一局、闲来无事来一局。各大手机厂商洞察到这一点,纷纷推出针对手游…

dart开发Android服务,关于android:在Flutter应用中使用由swagger生成的Dart代码生成的Web服务...

我正在尝试使用Flutter开发一个移动应用程序,我使用swagger生成了包含所有Web服务的Dart文件代码生成。我想从Web服务中获取所有用户的列表。 在屏幕上,我想为每个用户显示:图像,名字,姓氏和电子邮件。 我已经在main.d…

Altium Designer20原理图绘制

1.网络标签 如图所示,添加网络标签,两个相同标签连到一块 添加name,可以直接按TAB键改名,如果需要上横线,在字母后面加’\‘ 2.电源标识 3.画线 这里的线不是导线,不具有电气特性,是用来划…

Altium Designer20原理图库放置引脚报错解决方案

原理图库里点击放置引脚,然后AD20报错。 View Pin threw an exception. System.Windows.Markup.XamlParseException: 在“System.Windows.Markup.StaticResourceHolder”上提供值时引发了异常。 —> System.Exception: 无法找到名为“JustificationToAlignmen…

android微信表情导出来的,微信表情怎么导出 如何批量备份微信表情

微信表情怎么导出?如何批量备份微信表情?因为微信自身的软件限制因素,导致我们无法直接在手机客户端中完成自定义表情的导入操作,所以还请各位小伙伴们移步PC端同步助手来导入自定义表情哦~1)下载安装同步助手电脑版,将…

输出指定范围内的完数

题目要求 本题要求实现一个计算整数因子和的简单函数&#xff0c;并利用其实现另一个函数&#xff0c;输出两正整数m和n&#xff08;0<m≤n≤10000&#xff09;之间的所有完数。所谓完数就是该数恰好等于除自身外的因子之和。例如&#xff1a;6123&#xff0c;其中1、2、3为…

android 视频录制和上传,关于android实时视频录制与上传 .

关于android的实时视频录制现在网上炒的很火&#xff0c;我想把自己学习研究的一个视频录制的demo 的心得与大家分享一下使用的是MediaRecorder 以及使用SurfaceView进行录制的。视频录制的部分也比较简单&#xff0c;直接看API的图就可以很清楚的知道步骤了。Android的MediaRe…

输出指定范围内的Fibonacci数

题目要求 本题要求实现一个计算Fibonacci数的简单函数&#xff0c;并利用其实现另一个函数&#xff0c;输出两正整数m和n&#xff08;0<m≤n≤10000&#xff09;之间的所有Fibonacci数。所谓Fibonacci数列就是满足任一项数字是前两项的和&#xff08;最开始两项均定义为1&a…

html5中正则表达式怎么加,HTML5中的字母正则表达式(Alphabetic Regex in HTML5)

HTML5中的字母正则表达式(Alphabetic Regex in HTML5)我是regex的新手&#xff0c;但我需要找到一种方法来为HTML5表单添加一个过滤器&#xff1a;例如&#xff0c;任何人都可以帮我设置模式属性中的内容公认&#xff1a;JohnFrank不接受&#xff1a;Ke$haB0B(只接受字母字符。…

Android studio下载安装使用遇到的问题及解决办法

1.haxm文件已经下载&#xff0c;但未安装&#xff0c;导致启动avd模拟器不成功 ①&#xff1a;在Android Studio中打开 File | Settings | Appearance & Behavior | System Settings | Android SDK&#xff0c;下载HAXM ②&#xff1a;打开文件资源管理器&#xff0c;进…

html盒子自动居中,css盒子怎么居中?

在前端切图的时候&#xff0c;可能经常会遇到一个div盒子怎么在固定区域垂直居中的需求&#xff0c;下面我们来看一下css实现盒子居中的方法。css设置盒子居中的方法&#xff1a;第一种&#xff1a;用css的position属性.div1 {width: 100px;height: 100px;border: 1px solid #0…

Altium Designer20原理图库制作

1.绘制SMA元件 放置管脚&#xff0c;管脚的十字朝外&#xff0c;点击place pin 然后按TAB键。Designator是管脚号&#xff0c;Name可以不写。点击眼睛的按钮可以隐藏管脚号。 可以双击引脚修改长度 可以通过修改圆的宽度&#xff0c;变成实心的。 设置元器件的名字&#xff…

如何抓取html请求,怎么获取请求头

如何查看HTTP请CSS布局HTML小编今天和大家分享头方法/步骤 1 打开Chrome浏览器&#xff0c;点击右上角“三”按钮。 点击工具-再点击开发者工具 2 找到Network选项框。以百度经验页面为例&#xff0c;点击任务选框来查看网络请CSS布局HTML小编今天和大家分享流 3 在Network框内…

HTML5类选择器使用,CSS选择器种类及使用方法

CSS选择器种类及使用方法2018年04月17日| 萬仟网IT编程| 我要评论css选择器 有通配符选择器书写格式&#xff1a;*&#xff5b;声名块&#xff5d; 并集选择器/组合选择器 书写格式;元素或类或id“”元素或类或id“&#xff0c;”元素或类或id&#xff5b;声明块&#xff5d; 列…

输出一个整数的逆序数

题目要求 本题要求实现一个求整数的逆序数的简单函数。 函数接口定义&#xff1a; int reverse( int number ); 其中函数reverse须返回用户传入的整型number的逆序数。 代码&#xff1a; 处理一个数的每一位。 #include <stdio.h>int reverse( int number ); int r…

yii2 html 跳转,阐述在Yii2上实现跳转提示页

序言为了让用户有更加良好的体验&#xff0c;在操作成功或者失败后&#xff0c;来个提示并跳转页面&#xff0c;我就在Yii2上实现了这一个效果。在写这个跳转提示页的时候&#xff0c;找资料我发现网上关于这方面的中文资料真的很少&#xff0c;大家也都共享下吧&#xff01;需…

两数的和与差的简单函数

题目要求 本题要求实现一个计算输入的两数的和与差的简单函数。 函数接口定义&#xff1a; void sum_diff( float op1, float op2, float *psum, float *pdiff ); 其中op1和op2是输入的两个实数&#xff0c;psum和pdiff是计算得出的和与差。 代码 函数通过指针赋值。 #inc…