2012-09-18 3 views
0

공통 시나리오가 있습니다. 일부 표준 라이브러리 및 일부 사용자 라이브러리에 의존하는 실행 파일의 일부 소스 파일입니다. 표준 라이브러리가 동적으로 링크되는 반면 모든 사용자 라이브러리는 실행 가능 파일에 정적으로 링크됩니다.다중 정의 기호를 감지하는 방법

문제점 :나는 완전한 패키지 (이미 사용자 라이브러리 코드 + 공유 표준 라이브러리를 포함하고있는 실행 파일)에 여러 기호를 정의했다고 생각합니다. 링커는 분명히 그것에 대한 통찰력을 가지고 있지만 필자가 이해할 수 있듯이 링커는 여러 개의 강력한 심볼을 만나지 않는 한 불평하지 않습니다. 솔라리스 8/sparc 플랫폼에서 솔라리스 10/sparc 플랫폼으로 코드를 옮기고있는 중 일부 표준 유닉스 기능이 사용자 라이브러리에 구현되어 런타임에 앱이 다운되는 것을 두려워합니다. 앱에서

내가이의 값을 변화 하나의 라이브러리에서 하나 개의 변수를 수정 소스

  1. 수 있습니다 믿고 저를 주도 이상한 문제에 직면 한 솔라리스 8/SPARC 플랫폼에서 잘 실행합니다 다른 라이브러리에있는 또 다른 변수는
  2. Solaris 8-10: host2ip conversion problems

내가 필요한 것 :

    ,
  1. 곱하기 정의 된 모든 기호를 쉽게 나열 할 수 있습니까?
  2. 사용자 라이브러리에서 파생 된 모든 다중 정의 기호를 쉽게 나열 할 수있는 방법이 있습니까?
  3. 문제는 # 1 문제가 링크 문제로 인해 발생할 수 있다고 생각합니까? 아니면 다른 문제의 징후 일 수 있다고 생각하십니까?

EDIT1 : 는 그 이후로 나는 LD를 사용하여 맵 파일을 생성하기에, 그것이 내가 표준 라이브러리 호출과 같이 이름을 찾을 통해려고하고 다중 정의 심볼의 섹션이 있음을 알고있다. 모르는 사람들을 위해 링커는 동일한 이름을 가진 여러 기호를 찾고 그 이름이 강력한 이름 인 경우에만 연결에 실패합니다.

답변

0

무슨 일이 벌어지고 실제 문제가 : 라이브러리는이 배열 내 다른 도서관에서 사용되는

#define ARRAY_SIZE 1024 
SomeStruct* global_array[ARRAY_SIZE]; 

아래와 같이했다 배열 (의가 LIB1를 부르 자) 이것은 다시 (의이 LIB2를 부르 자) 내 응용 프로그램에서 extern 선언을 사용하여 사용합니다.

lib2를 컴파일하는 동안 (또는 앱이 확실하지 않은 경우) ARRAY_SIZE를 전혀 정의하지 않았습니다. 이것은 lib2 (또는 app)의 컴파일러가 global_array의 크기를 잘못 계산하여 이미 global_array에 할당 된 위치에 다른 변수에 대한 메모리를 할당하게했습니다.

내 라이브러리와 앱을 컴파일하는 동안 ARRAY_SIZE를 다시 정의하면 모든 것이 정상적으로 작동하기 시작합니다.나는 완전히 문제를 야기하고 배열의 통근 선언이 크기를 포함하지 않기 때문에 왜 문제가 해결됩니다 이해하지 않습니다. 또한 라이브러리가 실제로 MACRO ARRAY_SIZE를 사용한 경우 컴파일이 실패하지 않는 이유는 무엇입니까? 또한, 가능성은 정의에 사용되는 이름은 표준 이름 (실제 문자열이 FD_SETSIZE했다) 링커에 대한 느낌

내 초기 직감 잘못이라고,있다.

0

컴파일러 (실제로 링커) 설정에서 MAP 파일 생성을 활성화하고 염려되는 UNIX 시스템 기능과 일치하는 심볼에 대해 맵 파일을 조사 할 수 있습니다. 자동화를 위해 스크립트를 작성해야하지만, 이는 좋은 출발점이 될 것입니다. 명령 줄 스위치는 아마도 -map 또는 이와 비슷한 것으로, 사용중인 컴파일러/링커에 따라 달라집니다.

+0

나는 맵 파일을 이해하려고 노력하고 있습니다. 도움이 될만한 방법을 조금이라도 상세하게 설명 할 수 있다면 좋을 것입니다. 나는 GCC 프론트 엔드를 통해 "LD -m"에 의해 생성 된 맵 파일을 사용하고, 그것은 분명히 케이스가 중요한 경우 기호를 잘 모르겠어요 – IDK

+0

@IDK을 가지고 있지만, 당신이 링커 옵션을 사용하고 있는지 확인하지 않습니다-MAP = mapfile.map (gcc, -Wl, -Map = mapfile.map을 지나는 경우). 기호 이름과 그 위치가 mapfile에 생성됩니다. 그럼 당신은 inet_ntoa_r 같은 유닉스/다음 stdlib 함수와 이름이 같은 기호를 찾고있을 것입니다. 이것은 스크립트를 작성해야 할 부분입니다. – syplex

+0

ld는 해당 옵션을 선택하지 않습니다. 나는 gcc-2.95.2 -Wl -Map = mapfile.map 을 얻었고 ld : fatal : file ap = mapfile.map : stat failed : -M이 무엇인지 알 수없는 그런 파일이나 디렉토리가 없다 : 내가 대답의 하나로서 귀하의 제안을 표시 원하는 옵션 – IDK

관련 문제