2010-06-02 3 views
2

필자는 최근 Linux에서 gcc 4.5.0과 binutils 2.20을 금으로 사용하여 새로운 툴체인을 출시했습니다. 이제 나는이 새로운 PGO에 대해 궁금해했다. 실행 파일과 함께 작동하는 방법은 분명하지만 공유 라이브러리에 대한 답을 찾을 수 없었습니다. Gmail을 통해 gcc 메일 링리스트에 답이없는 두 개의 게시물을 찾았습니다. 그게 전부입니다.gcc의 공유 라이브러리에서 프로필을 통한 최적화가 가능합니까?

그럼 내가 시도한 것은 다음과 같습니다. -fprofile-generate 플래그를 지정하지 않으면 모든 것이 잘되고 내 .so는 주 프로그램에 의해 dlopen()되어 완벽하게 작동합니다. -fprofile-generate로 컴파일하고 링크하면 라이브러리가로드되고 모든 것이 작동하지만 주 프로그램을 종료하면 코어 덤프가있는 sigsegv를 얻습니다.

나는 gdb를하는 corefile (핵심 파일)를 공급이 있어요 :

#0 0x00000000 in ??() 
No symbol table info available. 
#1 0x1f32bc2f in ??() 
No symbol table info available. 
Backtrace stopped: previous frame inner to this frame (corrupt stack?) 

물론 더 .cdda 파일이 저장되지됩니다.

아이디어가 있으십니까?

+0

GDB를 어떻게 실행 했습니까? 나는 당신이 이것을했다고 생각합니다 : "gdb core". 대신 이렇게하십시오 : "gdb exename core". 기회는 더 의미있는 스택 추적을 얻을 수 있습니다. 또는 GDB에서 실행 파일을 시작부터 실행하십시오 : "gdb exename"then "run". –

+0

gdb exename core는 정확히 gdb를 실행 한 방법입니다. – Philipp

답변

2

나는 PGO를 사용하여 공유 라이브러리를 빌드합니다.

내가하는 일은 프로필 생성과 함께 모든 .o 파일을 가진 "프로필"디렉토리를 만드는 것입니다. 그런 다음 공유 라이브러리에 링크합니다. 그런 다음 profile-generate로 빌드 된 실행 파일에 링크 된 라이브러리로 프로파일 링을 실행합니다.

프로필을 사용하여 빌드 된 모든 .o 파일이있는 "릴리스"디렉토리를 만든 후 공유 라이브러리에 연결하고 PGO로 빌드 된 공유 라이브러리가 있습니다.

+0

이렇게하면 공유 객체 용과 실행 파일 용의 2 개의 프로필 파일을 만들 수 있습니다. gcc에 명령 줄 인수로 어떻게 든 전달합니까? 또는 gcc가 자동으로 찾아서 사용합니다 (기본 디렉토리 및 기본 이름으로 작성된 경우)? –

관련 문제