我想在不使用libc的情况下写一个很小的独立可执行文件。为了模拟一些libc函数,我需要让函数使用内联汇编执行syscall:
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");
}发布于 2014-02-12 22:45:31
首先,你需要能够控制你的工具链(gcc?)不包含除您的代码之外的任何额外内容。像-nostartfiles -nodefaultlibs to gcc这样的代码应该可以工作。
然后你需要很好地使用Linux,这意味着你的elf需要被操作系统正确加载,这意味着它需要让_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"
);
}https://stackoverflow.com/questions/21729497
复制相似问题