prosource

GCC로 C 프로그램의 진입점을 변경하는 방법은 무엇입니까?

probook 2023. 8. 1. 20:37
반응형

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
  1. 먼저 다음을 사용하여 컴파일합니다.-c재배치 가능한 개체 파일을 생성하려면 다음과 같이 하십시오.

    $ gcc -c program.c -o program.o
    
  2. 그런 다음 다시 정의합니다.entry되려고main:

    $ objcopy --redefine-sym entry=main program.o
    
  3. 이제 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

반응형