首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >GCC提出了奇怪的重定位R_X86_64_32S错误,但不是手动链接

GCC提出了奇怪的重定位R_X86_64_32S错误,但不是手动链接
EN

Stack Overflow用户
提问于 2021-05-15 11:02:11
回答 2查看 170关注 0票数 1

我正在尝试通过Linux环境下的syscall指令在一台x86_64机器上调用sys_write,其中包含C文件中的内联汇编。为此,我编写了以下代码:

代码语言:javascript
运行
AI代码解释
复制
[tjm@ArchPad poc]$ cat poc.c 
const char S[] = "abcd\n";

int main() {
    __asm __volatile(" \
            movq $1, %%rax; \
            movq $1, %%rdi; \
            movq %0, %%rsi; \
            movq $5, %%rdx; \
            syscall;"
            :
            : "i"(S)
            );
    return 0;
}

当我和GCC一起编译的时候,出现了以下错误:

代码语言:javascript
运行
AI代码解释
复制
[tjm@ArchPad poc]$ gcc -O0 poc.c -o poc
/usr/bin/ld: /tmp/ccWYxmSb.o: relocation R_X86_64_32S against symbol `S' can not be used when making a PIE object; recompile with -fPIE
collect2: error: ld returned 1 exit status

然后,我将-fPIE添加到编译器命令中。不幸的是,一切都没有改变:

代码语言:javascript
运行
AI代码解释
复制
[tjm@ArchPad poc]$ gcc -fPIE -O0 poc.c -o poc 
/usr/bin/ld: /tmp/ccdK36lx.o: relocation R_X86_64_32S against symbol `S' can not be used when making a PIE object; recompile with -fPIE
collect2: error: ld returned 1 exit status

这非常奇怪,这让我好奇地想手动编译和链接它:

代码语言:javascript
运行
AI代码解释
复制
[tjm@ArchPad poc]$ gcc -fPIE -O0 poc.c -S
[tjm@ArchPad poc]$ as -O0 poc.s -o poc.o
[tjm@ArchPad poc]$ ld -O0 -melf_x86_64 --dynamic-linker /usr/lib/ld-linux-x86-64.so.2 /usr/lib/crt{1,i,n}.o -lc poc.o -o poc

令人惊讶的是,在上面的尝试过程中没有发生错误。然后我测试了可执行文件的功能,这似乎是有效的:

代码语言:javascript
运行
AI代码解释
复制
[tjm@ArchPad poc]$ ./poc 
abcd

有没有想过为什么会发生这种情况,以及如何防止GCC推广上面的错误?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-05-15 16:55:27

立即移动指令movq $S, %rsi尽管采用64位寄存器,但仅采用32位带符号立即数。在构建与位置无关的可执行文件并使用ASLR运行时(这是大多数Linux系统上的默认设置),您的程序通常不位于虚拟内存的低或高31位中,因此像S这样的全局或静态对象的地址不适合有符号的32位立即数。

一种修复方法是使用movabs,它需要完整的64位立即数。用movabs %0, %%rsi替换movq %0, %%rsi可以构建代码。但是,更好的方法是使用RIP-relative addressing lea S(%rip), %rsi,这是一条较短的指令,避免了在加载时重新定位的需要。在内联asm中做这件事有点笨拙,所以你可以让编译器用"S" (S)这样的输入操作数为你加载地址到寄存器中(令人困惑的是,rsi寄存器的约束是S,它恰好与你为数组变量选择的名称一致)。

当您手动链接时,您构建了一个非位置独立的可执行文件,这意味着将地址视为常量是有效的。通过将-no-pie传递给gcc,也可以获得相同的效果。

您的代码还有另一个严重的问题,因为它没有声明它遇到的寄存器--不仅是显式mov到的寄存器,还包括syscall隐式修改的rcxr11。你应该看看How to invoke a system call via syscall or sysenter in inline assembly?,它有一个正确的例子。仔细研究这些例子是明智的-- GCC内联asm功能强大,但也很容易以编译器无法帮助你检测的微妙方式出错,可能在简单的程序中看起来有效,但在更复杂的程序中却无法预测地失败。

票数 1
EN

Stack Overflow用户

发布于 2021-05-15 14:50:15

对于ASM指令,GCC支持多种方言,默认值可能会有所不同。点击此处阅读更多信息:

代码语言:javascript
运行
AI代码解释
复制
https://gcc.gnu.org/onlinedocs/gcc/Extended-Asm.html#Extended-Asm

..。当然,这些方言彼此并不兼容。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67545995

复制
相关文章
Excel催化剂开源第3波-修复ExcelCom加载项失效问题及WPS可调用Com加载项的方法
为了还原一个干净无侵扰的网络世界,本文将不进行大规模地分发,若您觉得此文有用,不妨小范围地分享到真正有需要的人手中
Excel催化剂
2021/08/19
1.2K0
解决Excel下挪动加载项(.xlam)后,重新加载xlam还是每次启动Excel都报错的问题
问题描述:Excel加载了一个插件,但是因为目录调整自己挪动了位置,即使重新加载该插件,每次重启Excel还是报之前找不到插件的问题,虽然能使用,但是每次都报错很烦。
williamwong
2021/09/26
2.7K0
解决Excel下挪动加载项(.xlam)后,重新加载xlam还是每次启动Excel都报错的问题
如何确保安装并加载VBA加载项文件
在某些情形下,可能希望将加载项中的代码合并到其他VBA过程中,或者允许其他人访问你的加载项。此时,为了防止加载项卸载或未安装而导致出错,可以使用VBA代码确保加载项正确加载到你正在使用的任一Microsoft Office程序中。
fanjy
2023/08/30
3200
如何确保安装并加载VBA加载项文件
前端|对wps加载项的探究
WPS 加载项是一套基于 Web 技术用来扩展 WPS 应用程序的解决方案。每个 WPS 加载项都对应打开了一个网页,并通过调用网页中 JavaScript 方法来完成其功能逻辑。WPS 加载项打开的网页可以直接与 WPS 应用程序进行交互,同时一个 WPS 加载项中的多个网页形成了一个整体, 相互之间可以进行数据共享。开发者不必关注浏览器兼容的问题,因为 WPS 加载项的底层是以 Chromium 开源浏览器项目为基础进行的优化扩展。
算法与编程之美
2020/03/25
3.5K0
前端|npm全局创建wps加载项
基于vscode的方式创建wps加载项在获取类型之后,无法自动生成wps加载项,在网上查询相关问题内容也无果。不过Wps官方文档又更新了通过npm全局的方式创建wps加载项,下面就来具体介绍一下。
算法与编程之美
2020/03/31
1.9K0
js 数组去除重复数据-当WPS开始像支持VBA一样支持JS语言时,微软又该何去何从?
  有朋友留言说,微软早就在Office里也支持JS了,比如Script Lab……其实关于Script Lab,二年前我们就聊过一次。今天就再大家详细聊一下,这主要包含了以下内容:
宜轩
2022/12/26
2.6K0
IE Flash10b.ocx加载项失败 解决
在做一个页面的视频录制时,预览页面时,总会提示Flash10b.ocx加载项失败 ,导致IE被迫关闭,很是恼火。在网上搜了下,原来是原来是Adobe Flash player控件出的问题,10.0的版本加载IE会出现那样的问题。按照网上所说,将Adobe Flash player 10.0 卸载了,安装了Adobe Flash player 9.0的试了下尽可以了。就将此记录了
全栈程序员站长
2022/09/06
9180
真正彻底卸载ie8的某些加载项
但是,有的加载项“删除”不可选的,这时如果是你不想要的或流氓加载项咋办?如果你不只是禁用掉它,还需要永久删除掉它,怎么办?
williamwong
2018/07/24
8350
真正彻底卸载ie8的某些加载项
震惊!当Python遇到Excel后,将开启你的认知虫洞
本文主要讲Python与Excel的关系以及集成方案,Office家族的其他成员,如Word、PowerPoint与Excel拥有类似的功能,Python同样可以与Word、PowerPoint等Office成员结合,这些内容我以后会写文章讲解。
蒙娜丽宁
2020/06/03
3.6K0
web未能加载文件或程序集“XXX”或它的某一个依赖项
如果你将应用程序生成x86而不是Any CPU时,在64位操作系统中不会出错错误,而在32位操作系统中可能会出现以下错误
Python进阶者
2021/08/25
2.1K0
web未能加载文件或程序集“XXX”或它的某一个依赖项
如果你将应用程序生成x86而不是Any CPU时,在64位操作系统中不会出错错误,而在32位操作系统中可能会出现以下错误
前端皮皮
2020/11/26
1.5K0
web未能加载文件或程序集“XXX”或它的某一个依赖项
异常:System.BadImageFormatException,未能加载正确的程序集XXX或其某一依赖项
常:System.BadImageFormatException,未能加载正确的程序集XXX或其某一依赖项
跟着阿笨一起玩NET
2018/09/19
5.8K0
异常:System.BadImageFormatException,未能加载正确的程序集XXX或其某一依赖项
一项新特性提升MergeTree加载性能200倍
大家知道 MergeTree 是以分区目录的形式组织数据的,只要每写入一次数据,就会在磁盘上创建一个新分区文件(parts)。随着时间的推移,相同分区的文件会被合并成一个,关于这一块的逻辑可以看我的早期文章,《传送门》。
Nauu
2022/08/30
7390
WordPress移除head头部js、css、feed等多余加载项
在我们开发WordPress主题时,细心的小伙伴或发现网站头部如果加载head页面就会出现很多系统自带的加载项目,例如自带的css、js、feed、style等多余信息。
开心分享
2020/08/06
2.6K0
Excel技巧 – VLOOKUP(查找项,匹配数据项,使用匹配数据项序号,匹配条件) – 函数填充指定内容
在使用VLOOKUP的时候,请使用绝对引用:https://www.zanglikun.com/17999.html
收心
2023/08/24
1K0
Excel技巧 –  VLOOKUP(查找项,匹配数据项,使用匹配数据项序号,匹配条件) – 函数填充指定内容
python 加载excel报错
file1=pd.read_excel('F:/dataanalysis/statistics/PelicanStores.xlsx')
py3study
2020/01/06
9230
SpringBoot获取配置项原内容
那么使用该工具类getProperty("my.url")获取到的就是 https://${my.name}.com 原文, 而不是 https://test.com
code-x
2023/02/23
9720
小程序如何针对某次请求设置超时时间的加载项?
1、点击[编辑器] 2、点击[pagePath] 3、点击[文本] 4、点击[新建] 5、点击[文件夹] 6、点击[images] 7、点击[images] 8、点击[selectedIconPath] 9、点击[iconPath] 10、点击[编译] 11、点击[text] 12、点击[编译] 13、点击[编辑器] 14、点击[编译] 15、点击[编辑器] 16、点击[编译] 17、点击[编辑器] 18、点击[编辑器] 19
裴来凡
2022/05/28
2.3K0
小程序如何针对某次请求设置超时时间的加载项?
判断图片是否加载完成
有时需要获取图片的尺寸,这需要在图片加载完成以后才可以。有三种方式实现,下面一一介绍。 1、load事件 <!DOCTYPE HTML> <html> <head> <meta charset="utf-8"> <title>img - load event</title> </head> <body> <img id="img1" src="http://pic1.win4000.com/wallpaper/f/51c3bb99a21ea.jpg"> <p id="p1">loading...</p> <
前朝楚水
2018/04/02
4.6K0
点击加载更多

相似问题

如何检查office文档excel是否为只读office.js加载项

13

Excel Office.js加载项在Windows10上不再正确加载

37

Microsoft Excel加载项-如何知道它是否已经安装。office.js

13

使加载项在Excel 2016 for Windows中可用

10

OSX是否支持Office加载项?

11
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文