2013-02-08 6 views
1

libc를 사용하지 않고 입력 또는 출력물을 어떻게 가져 옵니까? 시스템 호출을 사용할 수는 있지만 도움이되는지는 알지 못했습니다.libc를 사용하지 않고 입력하기

+1

'libc'는 libc없이 I/O를 수행 할 수 있지만, 의미있는 대답을 얻으려면 어떤 시스템인지 알려줘야합니다. – FatalError

+0

x64 시스템이 내가 사용하고있는 것임 – user1888502

+0

'libc'에 대한 언급이 주어지면 이것이 유닉스 또는 리눅스 문제인 것처럼 보입니다. 그러나 예, 대상 플랫폼을 확인하는 것이 좋을 것입니다. – DigitalRoss

답변

1

플랫폼 독립적 인 방법이 없습니다. 실제로, libc을 갖는 요지는 대부분의 시스템이 제공하는 기능 집합과 공통 인터페이스를 갖는 것이지만 근본적으로 다른 방식으로 수행됩니다.

가장 좋은 방법은 현재 사용중인 시스템의 설명서를 참조하는 것입니다. OS의 인터럽트 집합을 검색 한 다음 asm 키워드를 사용하여 OS에 입력 또는 디스플레이 출력을 읽도록 지시하는 어셈블리 명령어를 작성할 수 있습니다. 파일 디스크립터에서 입출력을하기 위해 OS가 제공하는 라이브러리를 살펴본 다음 대신에 그 함수를 사용할 수 있습니다. 또는 프로세스 생성 라이브러리를 살펴본 다음 콘솔에서 데이터를 읽거나 쓰는 프로세스를 생성 할 수 있습니다. 여기서 두 번째 프로그램은 libc을 사용합니다. 그러나 이들 중 어느 것도 휴대용이 될 수는 없습니다.

희망이 도움이됩니다.

1

나는 시스템 호출 ABI가 어떻게 작동하는지에 대한 아이디어를 얻기 위해 write(2)을 gdb로 밟았다.

어쨌든, libc가 없습니다. 특별한 트릭이 없다면 cc (1) 컴파일러/링커 프론트 엔드는 여전히 libc와 연결되지만 아무 것도 사용하지 않을 것임을주의하십시오. C 런타임 시작 코드는 일부 libc 호출을 만들지 만이 프로그램은 실행되지 않습니다.

void mywrite(int fd, const void *b, int c) { 
    asm("movl $1, %eax"); 
    asm("syscall"); 
} 

int main(void) { const char *s = "Hello world.\n"; return mywrite(1, s, 13), 0; } 
+0

아니, LIBC를 사용하지 않고 리눅스 x64 – user1888502

+0

아하, 그럼 당신은'asm()'명령문을 사용하거나 x86_64 ABI가 커널에 함정하기 위해 사용하는 명령에 대한 자신의'write.s' 래퍼를 입력 할 수 있습니다. – DigitalRoss

+0

시스템 호출을 구현하거나 호출해야하는 asm 문은 어떻게 사용합니까? 입력을 받아서 출력을 보여 주려고? – user1888502

관련 문제