AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / user-14893287

relatively's questions

Martin Hope
relatively
Asked: 2024-12-16 01:12:59 +0800 CST

为什么我回显到 shell 的程序路径与我使用调试器在内存中找到的路径不匹配?

  • 6

我刚刚开始在 Mac Silicon M2 上学习 ARM 汇编。我编写了一个程序,它只接受命令行参数(又名 argv)并使用write系统调用打印它们(并返回它们的编号 argc)。

该程序运行:它使用我调用的精确路径输出二进制文件的完整路径。

但是,当我使用 lldb 检查内存中我确信 argv[0] 所取的位置时,它始终包含绝对路径。

这是因为 lldb 总是使用绝对路径运行它吗?有办法找出答案吗?如果是,这是 lddb 应该做的还是一个错误?

这是我的程序的源代码。

  1 // ARM assembly program on M2 for mac OS 14.7.1
  2 // print argv separated by newlines, return argc
  3 .global _start
  4 .p2align 2
  5 // input from OS:       W0 ... argc
  6 //                      X1 ... **char argv
  7 //                             argv[0] points to NULL separated concatenation
  8 //                             of elements of argv (for some reason)
  9 //
 10 // WORKING MEM: W19 argc
 11 //              X1 previous *argv for print
 12 //              X2 current str length
 13 //              W21 argc loop decr counter
 14 //              X22 *chr argv loop incr counter
 15 //              X23 *chr newline
 16 
 17 _start: 
 18         mov W19, W0             // W0 holds the number of args, copy
 19         adr X23, chr_newline    // make *"\n" available for printing
 20 // set up loop to print all arguments
 21         mov W21, W19       // put argc into loop counter
 22         ldr X22, [X1]      // X22 := *char argv[0]
 23 loop_argv:
 24         bl handle_arg      // print one argument
 25         sub W21, W21, #1   // decr loop counter
 26         cmp W21, #0        // loop if > 0
 27         b.gt loop_argv
 28 // exit
 29         mov  W0,   W19     // return code := argc
 30         mov  X16,  #1      // service code for termination
 31         svc  #0x80         // make sys call
 32 // local function handle_arg
 33 handle_arg:
 34         mov X1, X22        // save start *char in X1
 35         mov X2, #0         // X2 should contain len at end 
 36 count_chars_loop: // search for NULL char separating args
 37         ldrb W0, [X22], #1  // W0 = &X22, incr *char X22 after 
 38         cmp W0, #0          // check if prev X22 pointed to NULL char
 39         add X2, X2, #1      // incr len
 40         b.gt count_chars_loop
 41         sub X2, X2, #1      // correct for overcounting
 42         // X22 = *next argv now 
 43 //print argv[i] 
 44         mov X0, #1                // to stdout
 45         // *char next argv is already in X1
 46         // len(argv[i]) is already in X2
 47         mov  X16, #4              // nr for write call
 48         svc       #0x80           // make sys call
 49 // print newline
 50         mov X0, #1                // to stout
 51         mov X1, X23               // X1 = *char newline
 52         mov X2, #1                // len("\n")
 53         mov  X16, #4              // nr for write call
 54         svc       #0x80           // make sys call
 55         ret
 56 .align 2
 57 chr_newline: .ascii "\n"

我使用以下方法编译并链接它

as  get_args.s -o get_args.o
ld -o bin/get_args_min get_args_min.o -lSystem -syslibroot /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk -e _start -arch arm64     

以下是我在命令行上看到的内容:

me@c get_args % ./bin/get_args_min test test
./bin/get_args_min
test
test
me@c get_args %

注意相对路径。(我也尝试用绝对路径调用它,然后我确实在终端上得到了它。)但我们打印的位置似乎总是包含二进制文件的完整绝对路径。为了检查这一点,我使用了

lldb -- ./bin/get_args_min test test

...然后是 lldb 命令

b handle_args
r
re r

...然后复制 X22 中的地址,然后

memory read [PASTE]
macos
  • 1 个回答
  • 30 Views

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    重新格式化数字,在固定位置插入分隔符

    • 6 个回答
  • Marko Smith

    为什么 C++20 概念会导致循环约束错误,而老式的 SFINAE 不会?

    • 2 个回答
  • Marko Smith

    VScode 自动卸载扩展的问题(Material 主题)

    • 2 个回答
  • Marko Smith

    Vue 3:创建时出错“预期标识符但发现‘导入’”[重复]

    • 1 个回答
  • Marko Smith

    具有指定基础类型但没有枚举器的“枚举类”的用途是什么?

    • 1 个回答
  • Marko Smith

    如何修复未手动导入的模块的 MODULE_NOT_FOUND 错误?

    • 6 个回答
  • Marko Smith

    `(表达式,左值) = 右值` 在 C 或 C++ 中是有效的赋值吗?为什么有些编译器会接受/拒绝它?

    • 3 个回答
  • Marko Smith

    在 C++ 中,一个不执行任何操作的空程序需要 204KB 的堆,但在 C 中则不需要

    • 1 个回答
  • Marko Smith

    PowerBI 目前与 BigQuery 不兼容:Simba 驱动程序与 Windows 更新有关

    • 2 个回答
  • Marko Smith

    AdMob:MobileAds.initialize() - 对于某些设备,“java.lang.Integer 无法转换为 java.lang.String”

    • 1 个回答
  • Martin Hope
    Fantastic Mr Fox msvc std::vector 实现中仅不接受可复制类型 2025-04-23 06:40:49 +0800 CST
  • Martin Hope
    Howard Hinnant 使用 chrono 查找下一个工作日 2025-04-21 08:30:25 +0800 CST
  • Martin Hope
    Fedor 构造函数的成员初始化程序可以包含另一个成员的初始化吗? 2025-04-15 01:01:44 +0800 CST
  • Martin Hope
    Petr Filipský 为什么 C++20 概念会导致循环约束错误,而老式的 SFINAE 不会? 2025-03-23 21:39:40 +0800 CST
  • Martin Hope
    Catskul C++20 是否进行了更改,允许从已知绑定数组“type(&)[N]”转换为未知绑定数组“type(&)[]”? 2025-03-04 06:57:53 +0800 CST
  • Martin Hope
    Stefan Pochmann 为什么 {2,3,10} 和 {x,3,10} (x=2) 的顺序不同? 2025-01-13 23:24:07 +0800 CST
  • Martin Hope
    Chad Feller 在 5.2 版中,bash 条件语句中的 [[ .. ]] 中的分号现在是可选的吗? 2024-10-21 05:50:33 +0800 CST
  • Martin Hope
    Wrench 为什么双破折号 (--) 会导致此 MariaDB 子句评估为 true? 2024-05-05 13:37:20 +0800 CST
  • Martin Hope
    Waket Zheng 为什么 `dict(id=1, **{'id': 2})` 有时会引发 `KeyError: 'id'` 而不是 TypeError? 2024-05-04 14:19:19 +0800 CST
  • Martin Hope
    user924 AdMob:MobileAds.initialize() - 对于某些设备,“java.lang.Integer 无法转换为 java.lang.String” 2024-03-20 03:12:31 +0800 CST

热门标签

python javascript c++ c# java typescript sql reactjs html

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve