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
'IT이야기' 카테고리의 다른 글
ReSharper - Microsoft.Contracts 사용 시 Null 할당 가능 (0) | 2021.10.22 |
---|---|
사람들이 Spring MVC에서 XSS를 수행하는 것 방지 방법 (0) | 2021.10.22 |
PropertyInfo가 컬렉션인지 확인하는 방법 (0) | 2021.10.21 |
만료된 Facebook OAuth2 액세스 토큰을 새로 고치는 올바른 방법 (0) | 2021.10.21 |
사용자에게 POST 데이터를 다시 보내라는 메시지를 표시하지 않고 POST 후 브라우저 창 다시 로드 (0) | 2021.10.21 |