IT이야기

libc 없이 컴파일

cyworld 2021. 10. 22. 21:24
반응형

libc 없이 컴파일


(g)libc 없이 C 코드를 컴파일하고 싶습니다. 어떻게 비활성화할 수 있으며 어떤 기능이 의존합니까?

-nostdlib를 시도했지만 도움이 되지 않습니다. 코드는 컴파일 가능하고 실행되지만 여전히 실행 파일의 hexdump에서 libc의 이름을 찾을 수 있습니다.


를 사용하여 코드를 컴파일 -nostdlib하면 C 라이브러리 함수를 (물론) 호출할 수 없지만 일반 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있습니다. 또한 libc에 있는 memcpy(), memmove(), memset()및 에 대한 숨겨진 호출이 있을 수 memcmp()있으므로 자신의 버전을 제공해야 할 수도 있습니다(적어도 성능에 대해 너무 까다롭지 않은 한 어렵지 않음).

생산된 어셈블리를 보면 상황 더 명확해질 수 있습니다 ( -S플래그 사용 ).

참조URL : https://stackoverflow.com/questions/2548486/compiling-without-libc

반응형