2012-05-11 1 views
1

저는 C++ 실행 파일을 만들고 있습니다. 나는 사용자 정의 라이브러리를 포함하여 내가 사용하고있는 C 및 C++ 라이브러리를 정적으로 연결하고있다. (그러나 사용중인 모든 라이브러리를 정적으로 연결하지는 않습니다.)내 실행 파일의 .dynstr에 정적으로 링크 된 라이브러리의 기호가 들어있는 이유는 무엇입니까?

실행 파일을 고려하더라도 비정상적으로 큰 것으로 보입니다. 내가 .dynstr에서 내가 예상했던 것보다 훨씬 더 많은 공간을 사용하고 있다고 말해 준 objdump -h을 사용했습니다. 내가 -Os 컴파일 및 strip을 실행하지만

$ readelf -p .dynstr slamshift 

을 실행할 때 내가 정적으로 링크 한 라이브러리 (내 자신의 라이브러리에서 심볼

[ 13588] _ZN3yuu6windowC2Ev 
    [ 1359b] _ZTSN3yuu7gfx_ctxE 
    [ 135ae] _ZN4YAML7Scanner11ScanFlowEndEv 
    [ 135ce] __glewVertexFormatNV 

같은 많은 항목을 얻을 것 yaml- cpp 및 GLEW).

이러한 기호가 내 실행 파일에 나타나는 이유는 무엇입니까? 관련된 라이브러리를 정적으로 링크 한 경우 심볼 이름이 불필요하지 않아야합니까?

우분투 12.04, GCC 4.6.3 및 CMake와 기본 설정을 사용하여 관련성이있는 경우 빌드합니다.

답변

3


왜 이러한 기호 내 실행에 나타나고있다?

이러한 기호를 실행 파일에서 내보내고 동적 기호 테이블에 나타나는 이유는 두 가지뿐입니다.

  1. 당신은 --export-dynamic (일명 -E) 링커 플래그, 또는 링크에 참여하는 일부 다른 공유 라이브러리는 이러한 기호를 참조
  2. 하여 실행 파일을 연결.

# 1 일을하는 경우 대답은 간단합니다.하지 마십시오.

# 2로 인해 기호가 내보내기 된 경우 기호를 실제로 내보내려는 경우가 있습니다. 그렇지 않으면 코드가 다른 곳에서 실패 할 수 있습니다.

+0

실제로 문제는 기본적으로 -rdynamic을 포함하는 CMake로 밝혀졌으며 대부분의 다른 링커 플래그보다 우선합니다. –

1

ELF 실행 파일을 dl_open 및 친구들을 사용하여 동적 개체로 열 수 있다는 사실은 잘 알려져 있지 않습니다. 그렇게하려면 심볼 내보내기가 필요합니다. 나는 그것이 지금 일어난 일이라고 생각한다.

--exclude-libs ALL을 사용하여 최종 프로그램 링크를 링커에 시도해 볼 수 있습니다. gcc 명령 행에서 -Wl,--exclude-libs ALL처럼 보일 것입니다.
업데이트 :이 기호는 여전히 존재하지만 숨김으로 표시됩니다.

-Wl,--exclude-all-symbols을 사용해 볼 수도 있습니다.
업데이트 : 나는 이것에 대해 틀 렸습니다. PE 타겟에만 해당됩니다.

나는이 시도하고 일 : gcc -static -Wl,-s export-test.c