为什么strlen在汇编中会出现段错误?

问题描述 投票:0回答:1

我正在尝试向本地主机发出请求。我想知道我的消息的长度,但无法弄清楚我做错了什么。 输出如下:

    helloS  helloS  helloS  helloS  helloS  helloS  helloS  helloS  helloS  helloS  helloS  helloS  helloS  helloS  helloS  helloS./run.sh: line 1: 10066 Segmentation fault: 11

这就是 lldb 给出的:

代码在这里。 但更换时

adr x0, _msg
bl _strlen

mov x0, #5

一切正常。

macos assembly apple-m1 arm64
1个回答
0
投票

问题是您的

_send
实现不会保留
x30

当您硬编码

mov x0, #5
时,该函数中没有任何内容会破坏
x30
。但是当你调用
_strlen
时,就会将
x30
设置为
str x0, [sp, #4]
的地址,这意味着调用
_send
之后的
_strlen
部分将一遍又一遍地运行,每次都会增加
sp 
16 个字节,直到到达堆栈顶部并命中未映射的内存。

修复方法是在调用

x30
之前将
_strlen
溢出到堆栈,然后从那里重新加载它。

© www.soinside.com 2019 - 2024. All rights reserved.