我想用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");
}
答案 0 :(得分:3)
首先,您需要能够命令您的工具链(gcc?),以便不包含除代码之外的任何其他内容。像-nostartfiles -nodefaultlibs
到gcc
之类的东西应该有效。
然后你需要很好地使用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"
);
}