【发布时间】:2016-10-02 18:58:19
【问题描述】:
所以我正在尝试使用 ARM 程序集来获得时间,但在这样做时遇到了麻烦。这是我的代码:
.data
.balign 4
time:
.word 0
.text
.global _start
_start:
ldr r0, =time
mov r7, #0xd
svc #0
mov r7, #1
svc #0
但是,在使用GDB时,变量time的地址处的值始终为0。第一次系统调用后r0中的返回值始终为0xffffffda。它永远不会改变,我可以假设现在不是时代以来的时间。
我从中收集到的信息是: https://w3challs.com/syscalls/?arch=arm_strong
我正在尝试调用系统调用“时间”。
请注意,我正在使用 Raspberry Pi 2 模型 B 进行编程。链接指向 arm_strong 架构,而我正在使用的架构是 ARMv7。但本质上用 r7 要求中的 0 替换 9 可以获得我想要的系统调用。所以对于“时间”,我使用 0xd 而不是 0x90000d。
我做错了什么,返回值和传递给系统调用的指针都没有得到我期望的值?最终我想要做的是获取值并将其打印到控制台。
【问题讨论】:
-
-38 is
-ENOSYS,这表明可能值得为您正在运行的内核版本查找 实际 适当的系统调用号,而不是从一个疯狂的猜测-日期参考。 -
我试图寻找有关这方面的信息,但我没有运气。你建议我如何寻找实际合适的系统调用号?
-
这是我发现的更准确的表示:w3challs.com/syscalls/?arch=arm_thumb
-
time的零是因为运行时链接。执行程序时,动态链接器将填充它们。 -
一切对我来说都是正确的。我建议您只需将“R0”设置为 NULL (0),并且不要让 Linux 为您写入用户空间内存。
time_t适合 R0,您可以直接使用它。您可以这样做并查看错误代码是否更改?或者你成功了。您可以使用 Linux 'asm/unistd.h' 并从那里获取 0xd 常量作为__NR_time(和__NR_exit)。该问题可能与常量池和数据引用有关。您可能想要设置退出代码。我猜这个可执行文件在没有 SEGV 的情况下运行?
标签: linux assembly arm system-calls