- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
请帮助我使用 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 模式下执行 _start
到 main()
,
#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
以便堆栈跟踪终止。如果需要,您可以避免 argc
和 argv
处理。 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/
我在玩 GDB 的 rbreak . 时首先注意到它,然后做了一个最小的例子: (gdb) file hello_world.out Reading symbols from hello_world.
在linux _start()中是触发main()函数的汇编函数。 Windows 中有什么?我不确定我的问题是对还是错? 实际上我正在尝试在 Linux 中使用 _start() - 工作正常。但是
我有一个 elf64 可执行文件 foo,我想“手动”加载和启动它并能够从中调用其他函数。我如何将它加载到内存中,然后设置指令指针与它一起运行。 foo 不是一个共享对象库,它是一个可执行文件,具有像
我在 gcc 上编译的 c 代码给出了错误 Cannot find entry symbol _start defaulting to 00000 .谁能告诉我为什么以及如何纠正它? 命令行是 arm
我正在阅读一本描述加载程序如何工作的教科书: When the loader runs, it copies chunks of the executable object file into the
请帮助我使用 arm926ejs cpu 的 gnu 汇编程序。 我尝试构建一个简单的程序(test.S): .global _start _start: mov r0, #2 bx
我尝试将代码不放在主函数中,而是直接放在 _start 中: segment .text global _start _start: push rbp mov rbp,
当我汇编以下汇编代码时,出现错误 Segmentation fault (core dumped) section .text global _start _start: mov eax, 8
我正在 64 位 Linux 中构建没有 glibc 的简单应用程序。但我不知道如何获取参数。 我用谷歌搜索,发现 RDI 是 argc,RSI 是 argv。但它没有用。 当 _start 函数开始
'$' 后跟一个标识符是什么意思? x86 汇编,AT&T 语法。 最佳答案 在 AT&T 语法中 $意味着将后面的内容视为立即常量而不是内存地址。换句话说, movl $_start, %eax 加
在过去的几天里,我一直试图了解当我们执行一个 C 程序时幕后会发生什么。然而,即使在阅读了大量帖子后,我也找不到详细而准确的解释。有人可以帮我吗? 最佳答案 在编译和链接程序时,您通常会为特定用途找到
您好,我制作了一个简单的 hello world C 程序,我正在这样编译它: gcc -c hello.c ld hello.o -lc -o out 我从 ld 收到警告:ld : _start
我在我的应用程序中使用 Asp.Net MVC-4。我创建了一个 Controller ,例如 Person,在这个 Controller 中我有 3 个 Actions,例如 GetName、Get
我正在学习汇编编程。下面是打印“Hello, World!”的简单程序。当程序完美运行时,我收到警告消息,而 loading ld: warning: cannot find entry symbol
我一直在阅读 ELF 规范,但无法弄清楚程序入口点和 _start 地址从何而来。 看起来他们应该在一个非常一致的地方,但我做了一些琐碎的程序,_start 总是在不同的地方。 谁能澄清一下? 最佳答
这个问题在这里已经有了答案: Assembling 32-bit binaries on a 64-bit system (GNU toolchain) (2 个答案) 关闭 6 年前。 我试着在没
我试着写了一个makefile: CC = g++ LD = ld CFLAGS = -Wall -std=c++0x -O3 LDFLAGS = -lgsl -lgslcblas -lpth
我从同事那里收到了我的程序(在 RHEL 5.3 上运行的 qt 应用程序)的回溯,在分析它时我发现了一些我无法解释的东西。如果查看此回溯,您会注意到 main 和 _start 的跟踪。但在此之前,
我写了一个简单的 c 程序,并尝试使用 GDB 来调试程序。我了解在主要功能中使用以下内容: 进入时 push %ebp mov %esp,%ebp 退出时 leave ret 然后我在 _
我已经编译了一个fortran文件并创建了一个目标文件。之后我尝试执行目标文件但出现错误。操作系统是Ubuntu,错误如下: 编译源文件 gfortran -O3 reader.f iotools.c
我是一名优秀的程序员,十分优秀!