2014-02-12 1 views
3

libc를 사용하지 않고 작은 독립 실행 파일을 작성하려고합니다. 나는 리눅스와 ARM 프로세서를 사용하고ARM 인라인 어셈블리를 사용하여 libc없이 syscall을 수행

int syscall(int a,...) { 
return __asm__ volatile (/* DO STH HERE */); 
} 

: 제가 몇 가지 libc의 기능을 시뮬레이션에 필요한 것은 인라인 어셈블리를 사용하여 시스템 콜을 수행하는 기능을 가지고있다.

편집 :

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

잘 모르겠다. 그것은 syscall에서 errno에 관한 것이지만 팔 인라인 어셈블리를 사용하여 syscall을 수행하는 기능을 요구하고있다. –

+1

같은 질문을 읽고 있습니까? 그 중 하나에서 errno에 대해서는 아무 것도 보이지 않지만 SVC {} {} {#} '과 그 대답이 맨 위 대답에 표시되어 있습니다. –

+0

참조 : [Thumb as'_start'] (http://stackoverflow.com/questions/20369440/can-start-be-the-thumbfunction); 같은 대답으로 다른 질문. –

답변

2

먼저 당신이 당신의 툴체인 명령을 할 수 코드 이외의 아무것도 추가를 포함하지 할 필요 (GCC를?) 솔루션을 발견했다. -nostartfiles -nodefaultlibs ~ gcc과 같은 것이 작동합니다.

다음은 Linux으로 잘 작업해야합니다. 즉, 엘프가 os에 의해 올바르게로드되어야 함을 의미합니다. 즉, _start 포인트가 표시되어야 함을 의미합니다. 당신은 당신이 원하는 무엇을 포함 main를 만들 수 있습니다

void _start() __attribute__ ((naked)); 
void _start() { 
    main(); 
    asm volatile(
     "mov r7, #1\n" /* exit */ 
     "svC#0\n" 
    ); 
} 

: 다음은 그러한 예가 될 것입니다.

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을 가장 좋아한다.

+0

답변을 주셔서 감사하지만 모든 syscall을 수행하는 기능이 필요합니다. 또한 몇 가지 문제를 피하기 위해 VA_ARG를 사용해야합니다. –

+0

@ alireza7991 나는 variadic syscalls가 있다고 생각하지 않는다. 귀하의 질문에 언급 된 다른 답변이 귀하를위한 답으로 매우 적합 할 수 있습니다 (uclib가있는 syscalls의 보일러 플레이트 코드). 표준 libs가없는 printf의 가변 구현을위한 첫 번째 링크를 확인하십시오. – auselen

+0

그래서 모든 libc 함수에 대해 syscall 함수를 작성해야 할 필요가 있습니까? –

관련 문제