位置无关代码指向错误地址

2023-12-01

我有一个用 NASM(2.11.08) 编写的针对 macho64 架构的小示例程序。我正在运行 OSX 10.10.3:

bits 64

section .data

    msg1    db 'Message One', 10, 0
    msg1len equ $-msg1
    msg2    db 'Message Two', 10, 0
    msg2len equ $-msg2

section .text
    global  _main
    extern  _printf

_main:
    sub     rsp, 8  ; align

    lea     rdi, [rel msg1]
    xor     rax, rax
    call    _printf

    lea     rdi, [rel msg2]
    xor     rax, rax
    call    _printf

    add rsp, 8
    ret

我正在使用以下命令行进行编译和链接:

/usr/local/bin/nasm -f macho64 test2.s
ld -macosx_version_min 10.10.0 -lSystem -o test2 test2.o

当我对 test2 可执行文件进行对象转储时,这是相关的片段(如果我错了,我可以发布更多内容!):

0000000000001fb7 <_main>:
1fb7:   48 83 ec 08             sub    $0x8,%rsp
1fbb:   48 8d 3d 56 01 00 00    lea    0x156(%rip),%rdi        # 2118 <msg2+0xf3>
1fc2:   48 31 c0                xor    %rax,%rax
1fc5:   e8 14 00 00 00          callq  1fde <_printf$stub>
1fca:   48 8d 3d 54 00 00 00    lea    0x54(%rip),%rdi        # 2025 <msg2>
1fd1:   48 31 c0                xor    %rax,%rax
1fd4:   e8 05 00 00 00          callq  1fde <_printf$stub>
1fd9:   48 83 c4 08             add    $0x8,%rsp
1fdd:   c3                      retq  

...

0000000000002018 <msg1>:
0000000000002025 <msg2>:

最后,输出:

$ ./test2
Message Two
$

我的问题是,msg1 发生了什么?

我假设 msg1 没有打印,因为0x14f(%rip)不是正确的地址(只是空值)。

Why is lea edi, [rel msg2]指向正确的地址,同时lea edi, [rel msg1]是否指向 msg2 后面的 NULL?

它看起来像0x14f(%rip)offset 正好超出 msg1 在内存中的位置 0x100(在该问题的许多测试中都是如此)。

我在这里缺少什么?

编辑:.data 部分最后出现的消息(msg1 或 msg2)是唯一打印的消息。


IDK 关于 Mach-o ABI,但如果它与 GNU/Linux 使用的 SystemV x86-64 ABI 相同,那么我认为你的问题是你需要清除eax告诉 varargs 函数,例如printfFP 为零。

Also, lea rdi, [rel msg1]将是一个更好的选择。就目前情况而言,您的代码仅在虚拟地址空间的低 32 位内与位置无关,因为您将指针截断为 32 位。

NASM 似乎有一个错误。同样的问题又出现了:NASM 2行db(初始化数据)似乎不起作用。在那里,OP 确认数据存在,但标签错误,并希望向上游报告。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

位置无关代码指向错误地址 的相关文章

  • 在 64 位机器上,我可以安全地并行操作 64 位四字的各个字节吗?

    背景 我正在对图像中的行和列进行并行操作 我的图像是 8 位或 16 位像素 而我使用的是 64 位机器 当我并行对列进行操作时 两个相邻列可能共享相同的 32 位int或 64 位long 基本上 我想知道是否可以安全地并行操作同一四字的
  • 汇编编码 strdup. Malloc 在共享库中调用

    我有一个问题 调用 malloc 时无法编译 strdup 当我不调用 malloc 时 它会完美地编译我的共享库 所以如果有人可以帮助我 那就太好了 这是我的代码 BITS 64 DEFAULT REL global my strdup
  • 为什么 x86-64 System V 调用约定在寄存器中传递参数而不是仅在堆栈中传递参数?

    为什么 32 位 C 将所有函数参数直接压入堆栈 而 64 位 C 将前 6 个参数放入寄存器 其余参数压入堆栈 所以 32 位堆栈看起来像 arg2 arg1 return address old rbp 虽然 64 位堆栈看起来像 ar
  • 汇编部分 .code 和 .text 的行为不同

    我是装配新手 从我所学到的 code与 text 但是使用下面的代码会崩溃 code segment data msg db hello world 0xa len equ msg section text global start sta
  • NASM 中 %define 和 equ 有什么区别?

    Code define x 0x03 x equ 0x03 他们之间有什么区别 define是一种更强大的执行宏的方法 类似于 C 预处理器 在您的简单情况下 没有太大区别 使用x源代码中将导致常量3被替换 这其中有一个细微的差别equ语句
  • 如何在不链接libc.so的情况下访问段寄存器?

    我正在尝试在 Ubuntu 20 10 上使用 NASM 版本 2 15 04 在 64 位程序集中编写一个简单的堆栈金丝雀 执行下面的代码会导致在使用命令进行汇编和链接时出现分段错误nasm felf64 canary asm ld ca
  • 在堆栈上为 execve 创建一个 arg 数组

    我想编写一个汇编程序 通过 EXECVE 系统调用 0x3C 使用开关 al 执行程序 bin ls 手册页 man 2 execve 指出该调用需要三个值 int execve const char filename char const
  • 将 32 位和 64 位代码链接到一个二进制文件中

    在对此问题的评论中 内核空间 C 代码中简单指针算术的意外行为 https stackoverflow com questions 49470691 unexpected behaviour in simple pointer arithm
  • Fork 系统调用失败后 rax 中的返回值是多少?

    我知道打电话fork 在C中如果有错误将返回 1 但我想知道当你调用时错误返回值是什么sys fork在装配中 我通常会假设它也返回 1 但我已经处理过 sys brk 并且汇编中的原始系统调用返回与 C Brk 包装器不同的东西 有谁知道
  • 如何在 x86_64 上准确地衡量未对齐访问速度?

    In 一个答案 https stackoverflow com questions 45116212 are packed structs portable 45116730 45116730 我已经说过 在很长一段时间内 未对齐访问的速度
  • GCC 内联汇编错误:“‘int’的操作数大小不匹配”

    首先 如果有人知道标准 C 库的函数 则会打印 一个字符串 无需寻找二进制零 但需要绘制字符数 请告诉我 否则 我会遇到这个问题 void printStringWithLength char str ptr int n chars asm
  • 源操作数和目标操作数是否需要相同大小?

    我刚刚尝试了这个问题 要求你解释一下代码行有什么问题 movl eax rdx 解决方案表明目标操作数的大小错误 仅当从较大尺寸变为较小尺寸时才 非法 还是源操作数和目标操作数对于所有指令 或至少 mov 类类型 必须具有相同的尺寸 是的
  • “mov offset(%rip),%rax”有什么作用?

    Does rax获取偏移量加上这条指令的地址 还是下一条指令的地址 从微代码的角度来看 如果答案是下一条指令可能会更容易 下一个 这是 x86 上的一般规则 另请参阅分支 在 Intel 手册第 2 卷第 2 2 1 6 RIP 相对寻址部
  • 在长模式下更改 GDT 并更新 CS

    我正在编写一个简单的自制 64 位操作系统 通过 UEFI 启动它 这意味着当我的代码开始执行时 它已经处于长模式 并且启用了分页 现在 退出 UEFI 引导服务后 我想用我自己的控制结构替换 UEFI 构建的所有控制结构 成功更改 CR3
  • 分配内存空间的宏

    我需要让一个汇编程序员来计算帕斯卡三角形 https en wikipedia org wiki Pascal 27s triangle 这样帕斯卡三角形的每一行都与其他行分开存储在内存中 我想做一个 但我不知道如何使用宏在汇编中做到这一点
  • 编写 AMD64 SysV 程序集时使用哪些寄存器作为临时寄存器?

    我正在使用实现一个功能cpuid根据 AMD64 SysV ABI 进行组装 我需要在函数本身中使用 2 个临时寄存器 第一个用于累积返回值 第二个用作计数器 我的功能目前如下所示 zero argument function some c
  • 近调用/跳转表并不总是在引导加载程序中工作

    一般问题 我一直在开发一个简单的引导加载程序 并在某些环境中偶然发现了一个问题 在这些环境中 此类指令不起作用 mov si call tbl SI Call table pointer call call tbl Call print c
  • 在 x86-64 CPU 上通过交叉修改代码重现意外行为

    Question 对于可能在 x86 或 x86 x64 系统上触发意外行为的交叉修改代码有哪些想法 在这些系统中 交叉修改代码中的所有操作均已正确完成 但在执行处理器之前执行序列化指令除外修改代码 如下所述 我有一个 Core 2 Duo
  • 页面错误陷阱的成本

    我有一个应用程序 它定期 每 1 或 2 秒后 通过分叉自身来获取检查点 因此 检查点是原始进程的一个分支 它一直保持空闲状态 直到原始进程发生某些错误时被要求启动 现在我的问题是fork的写时复制机制的成本有多大 每当原始进程写入内存页面
  • 为什么我的空循环在 Intel Skylake CPU 上作为函数调用时运行速度是原来的两倍?

    我正在运行一些测试来比较 C 和 Java 并遇到了一些有趣的事情 在 main 调用的函数中 而不是在 main 本身中 运行具有优化级别 1 O1 的完全相同的基准代码 导致性能大约翻倍 我正在打印 test t 的大小 以毫无疑问地验

随机推荐

  • 将 javascript 客户端连接到 python websocket 服务器

    我有这个工作 python websocket 服务器 usr bin env python from socket import HOST PORT 8080 BUFSIZ 1024 ADDR HOST PORT tcpSerSock s
  • 如何使用开始和结束索引对 numpy 行进行切片

    index np array 1 2 2 4 1 5 5 6 z np zeros shape 4 10 dtype np float32 有什么有效的设置方法z np arange 4 index 0 z np arange 4 inde
  • 使用 Google Maps API 进行地理编码 - 更新现有标记而不是添加另一个标记

    在进行地理编码时 如何简单地将现有标记移动到新地理编码结果的结果中 让我们看这个例子 地图加载时 会出现一个标记 当有人进行地理编码时 标记会移动到结果 标记是可拖动的 因此用户可以进一步移动标记 如果他们愿意 也许他们想要重新对位置进行地
  • A-Frame .obj 模型显示但已损坏

    这里是框架的初学者 已经完成了教程场景 现在正在设置我的第一个使用 obj 模型 使用远程服务器 感觉这是重要的信息 我看到过有关模型未显示的问题 但我的模型显示已损坏 我不知道从哪里开始修复它 This is how it looks i
  • 使用 freeswitch 在网络浏览器中发起呼叫和接听呼叫

    我有一个要求 我有一个网站 我想在其中实现拨出呼叫和拨入呼叫功能 我在 Windows 上使用 freeswitch 作为 sip 服务器 目前我可以使用 verto 在本地分机上发起呼叫 如何直接从浏览器向手机发起出站呼叫 并且还可以使用
  • 如何在 Tfs Build 中参数化 DeployIisAppPath Msbuild 参数

    我正在使用 Tfs 2012 构建 部署我们的 Asp Net Web 应用程序 我们有一个构建定义 可构建 5 个解决方案 sln 文件 这就是我们的 MsBuild 参数的样子 p DeployOnBuild True p AllowU
  • 尽管参数类型不同,但双重定义错误

    我在以下两种方法上收到双重定义错误 def apply T state T onRender T gt Graphic onMouseEvent MouseEvent T gt T GraphicPanel apply state onRe
  • Postgres排序问题

    我想按 DESC 评级排序 它适用于 MySQL 但适用于 PostgreSQL 我得到了不同的结果 您可以在这里看到问题 http www vinderhimlen dk konkurrencer 我的控制器 def sort colum
  • 使用 C# 退出 Excel(同时使用 Excel 自动化)

    我正在使用 C 将数据读取 写入 Excel 电子表格 我正在使用这三个语句来打开我的 Excel 文件 Excel Application excelapp new Excel Application Excel Worksheet wo
  • C# 网格数据源多态

    我有一个网格 我正在设置DataSource to a List
  • Android Play 商店 market:// 链接不再有效?

    在过去的一年里 我一直从我的域重定向我的用户 http example com get 至 market details id com example myapp 今天我在 Nexus 5 LG G3 OnePlus One 上通过 Chr
  • 如何使用正则表达式将非字母数字字符替换为空格?

    我构建了一个 Javascript 函数来将第一个字母变为大写 我的问题是我有一些类似于 name something 的单词 而我想要的是 Name Something 我这样做了 function toCamelCase text re
  • 无法读取未定义的角度4的属性“名称”[重复]

    这个问题在这里已经有答案了 我正在尝试在组件模板中打印一个值 但我收到上述错误Cannot read property name of undefined 我已经从这个问题的代码中删除了额外的内容 我想访问第一行详细信息 组件文件 impo
  • Python:如何执行外部程序

    如何从程序内部执行程序而不阻塞 直到执行的程序完成 我努力了 os system 但它会停止我的程序 直到执行的程序停止 关闭 有没有办法让我的程序在外部程序执行后继续运行 考虑使用子流程 module Python 2 http docs
  • Javascript序列化窗口对象

    我想序列化一个包含窗口的窗口对象 这样 如果通过反序列化它并重新设置其属性来刷新 php 页面 则可以在内存中保持窗口打开 是否可以 例如 object window open test html 使用场景 当一个窗口打开时 它的引用是在创
  • 在一本大书中找到 10 个最常用的单词 [重复]

    这个问题在这里已经有答案了 我知道这个问题已经在论坛上被问过几次了 我没有找到任何可以被认为是最合适的解决方案的 标记 答案 所以再次询问 我们从书中得到了一篇非常大的文本 所有这些文本都无法放入内存中 我们需要找到文本中出现频率最高的 1
  • 解析地理查询始终为空

    我目前正在尝试让 Parse 的地理查询系统正常工作 在我的数据浏览器上 我安装了一个地理点类型的关键 位置 其中设置了纬度 30 27263636013176 和经度 97 75766807716373 的地理点 但是 如果我尝试使用以下
  • 如何获取Excel表格中选中的复选框值

    我正在执行一项与使用 Java 读取包含单选按钮和复选框的 excel 相关的任务 我已经尝试了很多 但无法进一步进行此操作 当我尝试读取包含复选框的单元格的数据时 它返回一个空值 有人可以帮忙解决这个问题吗 控件不包含在单元格中 而是作为
  • 如何使用 Ghostscript 将 PDF 转换为图像

    我发现 Ghostscript 能够将 PDF 转换为图像格式 I tried PDF 到图像转换器但无法清楚地理解它 我已经安装了gs905w64 exe但当我尝试add reference对于我的网络应用程序 我收到此错误 A refe
  • 位置无关代码指向错误地址

    我有一个用 NASM 2 11 08 编写的针对 macho64 架构的小示例程序 我正在运行 OSX 10 10 3 bits 64 section data msg1 db Message One 10 0 msg1len equ ms