gpt4 book ai didi

linux - _start 可以作为缩略图函数吗?

转载 作者:太空狗 更新时间:2023-10-29 11:04:43 27 4
gpt4 key购买 nike

请帮助我使用 arm926ejs cpu 的 gnu 汇编程序。

我尝试构建一个简单的程序(test.S):

.global _start 
_start:
mov r0, #2
bx lr

并成功构建它:

arm-none-linux-gnueabi-as -mthumb -o test.o test.S
arm-none-linux-gnueabi-ld -o test test.o

但是我在arm target linux环境下运行程序时,报错:

./test 
Segmentation fault

我做错了什么?_start 函数可以作为缩略图函数吗?或者总是arm func?

最佳答案

Can _start be a thumb function (in a Linux user program)?

是的,可以。这些步骤并不像您想象的那么简单。

请按照其他人的描述使用.code 16。另请参阅 ARM Script predicate ;我的回答显示了如何检测 thumb 二进制文件。入口符号必须具有传统的 _start+1 值,否则 Linux 将决定在 ARM 模式下调用您的 _start

您的代码也在尝试模拟,

 int main(void) { return 2; }

_start 符号不能这样做(根据 auselen )。要在 ARM 模式下执行 _startmain()

 #include <linux/unistd.h>
static inline void exit(int status)
{
asm volatile ("mov r0, %0\n\t"
"mov r7, %1\n\t"
"swi #7\n\t"
: : "r" (status),
"Ir" (__NR_exit)
: "r0", "r7");
}
/* Wrapper for main return code. */
void __attribute__ ((unused)) estart (int argc, char*argv[])
{
int rval = main(argc,argv);
exit(rval);
}

/* Setup arguments for estart [like main()]. */
void __attribute__ ((naked)) _start (void)
{
asm(" sub lr, lr, lr\n" /* Clear the link register. */
" ldr r0, [sp]\n" /* Get argc... */
" add r1, sp, #4\n" /* ... and argv ... */
" b estart\n" /* Let's go! */
);
}

最好清除 lr 以便堆栈跟踪终止。如果需要,您可以避免 argcargv 处理。 start 展示了如何使用它。 estart 只是将 main() 返回代码转换为 exit() 调用的包装器。

您需要将上述汇编程序转换为 Thumb 等价物。我建议使用 gcc 内联汇编器。如果内联可以工作,则可以转换为纯汇编程序源代码。但是,在“C”源代码中执行此操作可能更实用,除非您试图制作非常小的可执行文件。

有用的 gcc 论点是,

 -nostartfiles -static -nostdlib -isystem <path to linux user headers>

添加 -mthumb 并且您应该拥有适用于任一模式的线束。

关于linux - _start 可以作为缩略图函数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20369440/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com