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

时间:2014-02-12 13:37:01

标签: 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 r2,r3\nswi #1\n");
}

1 个答案:

答案 0 :(得分:3)

首先,您需要能够命令您的工具链(gcc?),以便不包含除代码之外的任何其他内容。像-nostartfiles -nodefaultlibsgcc之类的东西应该有效。

然后你需要很好地使用Linux,这意味着你的精灵需要被os正确加载,这意味着它需要_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;
}

然后写一些额外的写系统调用...

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"
    );
}

我在my github有一个更完整的例子。我最喜欢teensy