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
'source' 카테고리의 다른 글
| vue-i18n에서 십진수 및 십진수 없이 통화를 표시하려면 어떻게 해야 합니다. (0) | 2022.08.29 |
|---|---|
| Vue | vue-modent.js에 관한 문제 (0) | 2022.08.29 |
| VueJS 라우터의 'path'와 'fullPath'의 차이점은 무엇입니까? (0) | 2022.08.29 |
| CRUD가 vuejs vuex의 외부 구성 요소에서 개체를 추가함 (0) | 2022.08.29 |
| Vue에서 하드코드된 favicon을 제거하는 방법은? (0) | 2022.08.29 |