문제

현재 수백 개의 코드 파일과 종속성을 여러 타사 라이브러리에 Mac OS로 향한 프로젝트를 포팅하고 있습니다. 나는 마침내 프로그램이 경고 나 오류없이 컴파일되는 시점에 도달했지만 내 자신의 주요 기능을 실행하지 않는 것 같습니다.

대신 그것은 제 3 자에 속하는 것으로 보이는 다른 주요 기능을 실행하는 것 같습니다. 이 기능은 콘솔에 진단적인 데이터를 작성하고 나중에 종료합니다.

(gdb) continue
Current language:  auto; currently c++
//
// This is an automatically generated file.
// Do not edit.
//

const unsigned short expTable[] =
{
    0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 
...
    0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 
};

Debugger stopped.
Program exited with status value:0.

스택 트레이스가 유효한 것처럼 보이지만 GDB는 각 스택 항목에 대한 올바른 줄 번호와 파일 이름을 표시하지 않기 때문에 디버거를 사용 하여이 기본 기능이있는 위치를 찾을 수 없습니다. 이 해결되지 않은 질문 자세한 내용은).

검색은 완료하는 데 몇 분이 걸렸지 만 결과를 반환하지 않았습니다.

내 프로젝트는 다른 라이브러리 중에서 SDL을 사용하고 있지만 SDL_MAIN ()과 기본 문제를 수상했으며 완벽하게 훌륭한 작업 SDL 프로젝트 템플릿 위에 프로젝트를 구축했습니다. 그래서 나는 내 자신의 주요 기능이 유효하다고 확신합니다.

무엇이 잘못 될지 아십니까? 나는 현재 로그 메인 기능을 찾고 제거하는 방법에 대한 아이디어가 없습니다.

감사,

아드리안

편집하다: 방금 알게 된 바와 같이, "이것은 자동으로 생성 된 것입니다"라는 문자열로 파일 파일을 검색하는 동안 실수를 저질렀습니다. 방금 동일한 문자열이있는 수십 개의 파일을 발견했으며 모두 FreeImage에 속한 파일을 찾았습니다. 따라서 문제는 FreeImage와 관련이있는 것처럼 보이지만, 동봉 된 MACOS MakeFile이있는 라이브러리로 FreeImage를 컴파일하고 라이브러리 만 포함했기 때문에 아직 진행 방법은 확실하지 않습니다. 나는 새로운 버전의 FreeImage를 재건하고 그것이 내 문제를 해결했는지 확인하려고 노력할 것입니다.

도움이 되었습니까?

해결책

main ()가 호출되기 전에 실패하는 정적 객체의 이니셜 라이저 일 수 있습니까?

다른 팁

바이너리에 여러 메인이 있습니까? 사용해보십시오 nm 그 위에. (가능하지 않아야합니다 ld 중복과 연결되지는 않지만 동적 인 Libs로 이동하여 _main 거기)

nm a.out | grep -5 _main

이것은 전후에 5 줄을 주어야합니다 _main 이진에서 발견됩니다 a.out

몇 가지가있는 경우, 어떤 부분이 있는지 힌트에 대한 주변 기호를 참조하십시오.

다음 단계는 사용되는 각 동적 리브에서 동일하게 수행하는 것입니다. 중고 동적 라이브러리 사용 목록을 얻으려면otool

otool -L a.out

다른 하나를 찾는 방법은 확실하지 않지만 자신의 진입 점을 명시 적으로 지정하고 다른 하나를 사용하지 않을 수 있습니다. GNU 링커를 사용할 수 있습니다 LD -E 입력 지점을 설정하는 옵션.

-E 항목

--entry = Entry

기본 입력 지점이 아닌 프로그램 실행을 시작하기위한 명시 적 기호로 항목을 사용하십시오. 항목이라는 이름이없는 경우 링커는 항목을 숫자로 구문 분석하려고 시도하고 항목 주소로 사용합니다 (숫자는 기본 10에서 해석됩니다. 16 기반의 주요 0x를 사용할 수 있습니다. 기본 8의 경우 0).

미래의 독자들 에게이 문제가있는 경우 Windows에 있습니다. 동등한 링커 옵션은 다음과 같습니다 /기입.

실행 파일을 실행 해보 셨나요? nm? 힌트를 줄 수 있습니다. 전 세계적으로 보이는 기능이 하나 이상인 프로그램을 연결하는 것이 불가능하다고 생각하지 않을 것입니다. main(), 그것이 어떻게 발생하는지 잘 모르겠습니다.

포함 된 헤더 파일을 살펴보고 해당 재발 명이 없는지 확인하십시오. main 다른 것에. 이것은 라이브러리의 주요 기능을 먼저 설정하여 일부 설정을 수행하도록하는 오래된 트릭입니다. 일반적으로 재정의 된 값을 참조하여 결국 주요 기능을 호출합니다.

빠른 해킹 :

readelf -s -w my_bin_file > temp.txt

temp.txt를 열고, 메인을 검색하십시오 (한 열에 func가있는) 첫 번째 파일 열을 찾을 때까지 올라갑니다. 이것은 링크 된 기본이있는 파일입니다.

편집하다: 이것은 GNU 유닉스 풍미와 친구에게만 작동합니다. OS X는 ELF가 아닌 Mach-O 형식을 사용합니다.

C에서는 주요 기능 전에 다른 입력 점을 호출 할 수 있다는 것을 알고 있습니다. 그것은 아이디어 일 수 있습니다. 코드는 일반적으로 다음과 같습니다.

void __attribute__ ((constructor)) my_main(void);

코드에서 그런 것을 검색 할 수 있습니다.

C에는 주요 기능을 포착하고 "실제"메인 이후에 호출하는 방법이 다릅니다. 일부 스레드 라이브러리에는 환경, 스케줄러 등을 "준비"하기 위해 이러한 종류의 해킹이 있습니다.

이것은 실제로 유용하지 않지만 메인이 전혀 호출되지 않은 이유를 설명 할 수 있습니다.

도움이 되었기를 바랍니다!

또 다른 메모.

wxwidgets는 또한 자신의 것을 정의합니다 main

에서 여기

모든 프로그램에서와 같이 "메인"기능이 있어야합니다. WXWIDGETS에서 Main 은이 매크로를 사용하여 구현되어 응용 프로그램 인스턴스를 생성하고 프로그램을 시작합니다.

IMPLEMENT_APP(MyApp)

파일을 호출 할 수있는 것 같습니다 b44ExpLogTable.cpp 이진 또는 일부 제 3 파트 라이브러리로 컴파일됩니다. 작은 프로그램이 exp () 테이블을 생성하는 것 같지만 어떻게 든 프로젝트로 가져 오게되었습니다.

보다 이것 그리고 이것 자유 이유 소스

맵 파일을 생성합니다. 대부분의 프로그램은 실제로 메인에서 시작하지 않습니다. GCC의 MapFile은 __start 또는 __Executable_start의 주소를 알려야합니다.이를 통해 프로그램이 종료되는 원인을 확인하기 위해 헤어질 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top