使用ARM内联汇编在没有libc的情况下执行系统调用

使用ARM内联汇编在没有libc的情况下执行系统调用,c,linux,assembly,arm,system-calls,C,Linux,Assembly,Arm,System Calls,我想在不使用libc的情况下编写一个小型的独立可执行程序。我需要模拟一些libc函数,让函数使用内联汇编进行系统调用: int syscall(int a,...) { return __asm__ volatile (/* DO STH HERE */); } 我正在使用Linux和ARM处理器 编辑:找到解决方案: int syscall(int n,...) { return __asm__ volatile ("mov r7,r0\nmov r0,r1\nmov r1,r2\nmov

我想在不使用libc的情况下编写一个小型的独立可执行程序。我需要模拟一些libc函数,让函数使用内联汇编进行系统调用:

int syscall(int a,...) {
return __asm__ volatile (/* DO STH HERE */);
}
我正在使用Linux和ARM处理器

编辑:找到解决方案:

int syscall(int n,...) {
return __asm__ volatile ("mov r7,r0\nmov r0,r1\nmov r1,r2\nmov r2,r3\nswi #1\n");
}

首先,您需要能够命令您的工具链(gcc?)不包含除代码之外的任何额外内容。类似于
-nostartfiles-nodefaultlibs
gcc
的东西应该可以工作

然后你需要很好地使用
Linux
,这意味着你的elf需要被操作系统正确加载,这意味着它需要有
\u start
点可见。下面就是这样一个例子:

void _start() __attribute__ ((naked));
void _start() {
    main();
    asm volatile(
        "mov r7, #1\n" /* exit */
        "svc #0\n"
    );
}
然后,您可以创建一个
main
,其中包含您想要执行的操作

int main() {
    linuxc('X');
    return 42;
}
然后使用write syscall执行额外操作

void linuxc(int c) {
    asm volatile(
        "mov r0, #1\n" /* stdout */
        "mov r1, %[buf]\n" /* write buffer */
        "mov r2, #1\n" /* size */
        "mov r7, #4\n" /* write syscall */
        "svc #0\n"
        : /* output */ : [buf] "r" (&c) : "r0", "r1", "r2", "r7", "memory"
    );
}

我有一个更完整的例子。我最喜欢的一个。

不确定,这是关于arm系统调用中的errno,但我要求提供一个函数,使用arm内联汇编进行系统调用。我们正在阅读相同的问题吗?我没有看到关于errno的任何内容,但我确实看到了
SVC{}{{{}{{}{{code>以及顶部答案中对它的解释;不同的问题有相同的答案。感谢您的回答,但我需要一个函数来执行任何系统调用,而不仅仅是编写系统调用。它还应该使用VA_ARGs来避免一些问题。@alireza7991我认为没有任何可变系统调用。我在你问题的评论中提到的另一个答案可能非常适合作为你的答案(uclib系统调用的锅炉板代码)。检查我的printf变量实现的第一个链接,没有标准的libs。所以我需要为每个libc函数编写一个syscall函数?有没有办法使用汇编代码(不是内联汇编)?是的,是的。你只需要从某个地方开始。