libc 없는 컴파일
(g)libc를 사용하지 않고 C-코드를 컴파일합니다.비활성화하려면 어떻게 해야 하며 어떤 기능이 이에 따라 달라집니까?
nostdlib을 시도했지만 도움이 되지 않습니다.코드는 컴파일 가능하며 실행되지만 실행 파일의 16진수 덤프에서 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
또, 은닉 콜이 있는 경우도 있습니다.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 |