source

libc 없는 컴파일

factcode 2022. 8. 29. 22:03
반응형

libc 없는 컴파일

(g)libc를 사용하지 않고 C-코드를 컴파일합니다.비활성화하려면 어떻게 해야 하며 어떤 기능이 이에 따라 달라집니까?

nostdlib을 시도했지만 도움이 되지 않습니다.코드는 컴파일 가능하며 실행되지만 실행 파일의 16진수 덤프에서 libc 이름을 찾을 수 있습니다.

코드를 컴파일 할 경우-nostdlibC 라이브러리 함수를 호출할 수는 없지만(물론), 일반 C 부트스트랩 코드도 얻을 수 없습니다.특히, Linux에서 프로그램의 실제 시작점은main()라고 하는 기능이 있습니다._start()표준 라이브러리는 보통 일부 초기화 코드를 실행하고 콜을 실행하는 버전을 제공합니다.main().

이 컴파일을 사용해 보세요.gcc -nostdlib -m32:

void _start() {

    /* main body of program: call main(), etc */

    /* exit system call */
    asm("movl $1,%eax;"
        "xorl %ebx,%ebx;"
        "int  $0x80"
    );
}

_start()함수는 항상 에 대한 호출로 종료해야 합니다.exit(또는 다음과 같은 기타 비표준 시스템콜)exec위의 예에서는 보통 인라인어셈블리를 사용하여 시스템콜을 직접 호출하고 있습니다.exit()사용할 수 없습니다.

가장 간단한 방법은 C 코드를 오브젝트 파일에 컴파일하는 것입니다(gcc -c구하다*.o파일)을 사용하여 링커에 직접 링크합니다(ld오브젝트 파일을 다음과 같은 추가 오브젝트 파일과 링크해야 합니다./usr/lib/crt1.o(커널로 볼 수 있는 엔트리 포인트와) 동작 실행 파일을 취득하기 위해서입니다.main()기능, 할 일이 좀 있습니다.링크 대상을 알아보려면 glibc를 사용하여 링크를 시도합니다.gcc -v: 보통 실행 파일에 무엇이 포함되는지 보여줍니다.

gcc는 몇 가지 숨겨진 함수에 의존할 수 있는 코드를 생성합니다.대부분은 안에 있다libgcc.a또, 은닉 콜이 있는 경우도 있습니다.memcpy(),memmove(),memset()그리고.memcmp()Libc에 포함되어 있기 때문에, 독자적인 버전을 제공할 필요가 있는 경우가 있습니다(최소한 퍼포먼스에 너무 까다롭지 않은 한, 어려운 것은 아닙니다).

생산된 어셈블리를 보면 더 명확해질 수 있습니다.-S플래그)를 클릭합니다.

언급URL : https://stackoverflow.com/questions/2548486/compiling-without-libc

반응형