공통 시나리오가 있습니다. 일부 표준 라이브러리 및 일부 사용자 라이브러리에 의존하는 실행 파일의 일부 소스 파일입니다. 표준 라이브러리가 동적으로 링크되는 반면 모든 사용자 라이브러리는 실행 가능 파일에 정적으로 링크됩니다.다중 정의 기호를 감지하는 방법
문제점 :나는 완전한 패키지 (이미 사용자 라이브러리 코드 + 공유 표준 라이브러리를 포함하고있는 실행 파일)에 여러 기호를 정의했다고 생각합니다. 링커는 분명히 그것에 대한 통찰력을 가지고 있지만 필자가 이해할 수 있듯이 링커는 여러 개의 강력한 심볼을 만나지 않는 한 불평하지 않습니다. 솔라리스 8/sparc 플랫폼에서 솔라리스 10/sparc 플랫폼으로 코드를 옮기고있는 중 일부 표준 유닉스 기능이 사용자 라이브러리에 구현되어 런타임에 앱이 다운되는 것을 두려워합니다. 앱에서
내가이의 값을 변화 하나의 라이브러리에서 하나 개의 변수를 수정 소스
- 수 있습니다 믿고 저를 주도 이상한 문제에 직면 한 솔라리스 8/SPARC 플랫폼에서 잘 실행합니다 다른 라이브러리에있는 또 다른 변수는
- Solaris 8-10: host2ip conversion problems
내가 필요한 것 :
-
,
-
곱하기 정의 된 모든 기호를 쉽게 나열 할 수 있습니까? - 사용자 라이브러리에서 파생 된 모든 다중 정의 기호를 쉽게 나열 할 수있는 방법이 있습니까?
- 문제는 # 1 문제가 링크 문제로 인해 발생할 수 있다고 생각합니까? 아니면 다른 문제의 징후 일 수 있다고 생각하십니까?
EDIT1 : 는 그 이후로 나는 LD를 사용하여 맵 파일을 생성하기에, 그것이 내가 표준 라이브러리 호출과 같이 이름을 찾을 통해려고하고 다중 정의 심볼의 섹션이 있음을 알고있다. 모르는 사람들을 위해 링커는 동일한 이름을 가진 여러 기호를 찾고 그 이름이 강력한 이름 인 경우에만 연결에 실패합니다.
나는 맵 파일을 이해하려고 노력하고 있습니다. 도움이 될만한 방법을 조금이라도 상세하게 설명 할 수 있다면 좋을 것입니다. 나는 GCC 프론트 엔드를 통해 "LD -m"에 의해 생성 된 맵 파일을 사용하고, 그것은 분명히 케이스가 중요한 경우 기호를 잘 모르겠어요 – IDK
@IDK을 가지고 있지만, 당신이 링커 옵션을 사용하고 있는지 확인하지 않습니다-MAP = mapfile.map (gcc, -Wl, -Map = mapfile.map을 지나는 경우). 기호 이름과 그 위치가 mapfile에 생성됩니다. 그럼 당신은 inet_ntoa_r 같은 유닉스/다음 stdlib 함수와 이름이 같은 기호를 찾고있을 것입니다. 이것은 스크립트를 작성해야 할 부분입니다. – syplex
ld는 해당 옵션을 선택하지 않습니다. 나는 gcc-2.95.2 -Wl -Map = mapfile.map 을 얻었고 ld : fatal : file ap = mapfile.map : stat failed : -M이 무엇인지 알 수없는 그런 파일이나 디렉토리가 없다 : 내가 대답의 하나로서 귀하의 제안을 표시 원하는 옵션 – IDK