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
참고: 프로그램에 이미 다음과 같은 기능이 있는 경우main
2단계 전에 별도의 작업을 수행할 수 있습니다.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 |