GCC로 C 프로그램의 진입점을 변경하는 방법은 무엇입니까?
gcc로 컴파일된 C 프로그램의 진입점을 변경하는 방법은 무엇입니까?
다음 코드와 같이
#include<stdio.h>
int entry() //entry is the entry point instead of main
{
return 0;
}
링커 설정입니다.
-Wl,-eentry
그-Wl,...사물은 링커에게 인수를 전달하고 링커는-e입력 함수를 설정하기 위한 인수
소스 코드를 다음과 같이 수정할 수 있습니다.
#include<stdio.h>
const char my_interp[] __attribute__((section(".interp"))) = "/lib/ld-linux.so.2";
int entry() //entry is the entry point instead of main
{
exit(0);
}
".interp" 섹션을 통해 프로그램이 외부 공유 라이브러리를 호출할 수 있습니다.종료 호출은 프로그램을 종료하는 대신 프로그램을 종료하는 입력 기능을 만듭니다.
그런 다음 프로그램을 실행 가능한 공유 라이브러리로 빌드합니다.
$ gcc -shared -fPIC -e entry test_main.c -o test_main.so
$ ./test_main
(리눅스와 같이) GNU Binutils를 제공하는 시스템에 있는 경우,objcopy임의 함수를 새 진입점으로 만드는 명령입니다.
다음과 같은 파일이 있다고 가정합니다.program.c을 포함하는entry함수:
$ cat > program.c
#include <stdio.h>
int entry()
{
return 0;
}
^D
먼저 다음을 사용하여 컴파일합니다.
-c재배치 가능한 개체 파일을 생성하려면 다음과 같이 하십시오.$ gcc -c program.c -o program.o그런 다음 다시 정의합니다.
entry되려고main:$ objcopy --redefine-sym entry=main program.o이제 gcc를 사용하여 새 개체 파일을 컴파일합니다.
$ gcc program.o -o program
참고: 프로그램에 이미 다음과 같은 기능이 있는 경우main2단계 전에 별도의 작업을 수행할 수 있습니다.objcopy호출:
objcopy --redefine-sym oldmain=main program.o
실행 가능한 최소 예제 및 기타 답변에 대한 참고 사항
주.c.
#include <stdio.h>
#include <stdlib.h>
int mymain(void) {
puts("hello");
exit(0);
}
컴파일 및 실행:
gcc -nostartfiles -Wl,--entry=mymain -o main.out main.c
# or -Wl,-emymain
./main.out 1 2 3
참고 사항:
없이.
-nostartfiles링크가 실패하고 다음 오류가 있습니다./usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/Scrt1.o: In function `_start': (.text+0x20): undefined reference to `main' collect2: error: ld returned 1 exit status아마도 main 이전에 실행되는 glibc 설정 코드 때문일 것입니다.
_start보통 방문.main.명령줄 인수는 main 이전에 실행되는 glibc 코드에 의해 설정되기 때문에 설정되지 않으므로, 명령줄 인수를 사용하려고 하면 정의되지 않은 값이 인쇄됩니다.저는 그들에게 맞는 방법을 찾지 못했습니다.
Ubuntu 20.10에서 테스트되었습니다.
언급URL : https://stackoverflow.com/questions/7494244/how-to-change-entry-point-of-c-program-with-gcc
'prosource' 카테고리의 다른 글
| 선택한 열을 영상 시리즈가 아닌 데이터 프레임으로 유지 (0) | 2023.08.01 |
|---|---|
| 봄 - 동일한 애플리케이션에서 여러 트랜잭션 관리자를 사용할 수 있습니까? (0) | 2023.08.01 |
| "position: sticky;" 속성은 어떻게 작동합니까? (0) | 2023.08.01 |
| 재귀적 MySQL (0) | 2023.08.01 |
| HTTP 기본 인증을 사용하는 JQuery Ajax 호출 (0) | 2023.08.01 |