2013-01-23 9 views
3

같은 소스 코드를 빌드하면 같은 툴 체인 (동일한 컴파일러, 링커 등, GCC 4.4)을 사용하여 동일한 라이브러리의 동일한 버전으로 링크하고 동일한 운영 체제의 동일한 버전 (CentOS 5 Linux 내 경우에는)하지만 두 개의 다른 기계;두 개의 동일한 플랫폼에 두 개의 공유 라이브러리가 구축 될 것으로 기대하는 것이 합리적입니까?

생성 된 바이너리가 동일해야한다고 생각하는 것이 합리적입니까?

이 컨텍스트는 내 코드가 하나의 구성에서는 작동하지만 다른 것은 작동하지 않는 명백한 대답은이를 수정하는 것이지만 바이너리 생성에 대한 내 가정이 동일하다는 것은 정확하다.

크기가 수백 바이트 차이가 나는데, 'nm'명령으로 표시된 심볼의 위치는 기호가 동일하더라도 약간 다릅니다.

+0

공유 라이브러리가 동일하게 사용하는 다른 모든 구성 요소도 있습니다 (예 : 가장 명확한 구성 요소는 glibc입니까? –

+3

같은 방법으로 같은 시간대에 동일한 소스 코드를 작성하면 결과는 동일합니까? – aschepler

+1

짧은 답변은 "모든 것이 정확히 동일하면"동일한 결과를 얻는 것입니다 ([날짜]와 [빌드 번호] 및 '컴파일시 제공되는 유사한 정보'가 바이너리에 포함되는 것과는 별개로) -하지만 그 정보 자체에만 영향을 미쳐야합니다.] –

답변

1

일반적으로 날짜 및/또는 메타 데이터는 동일한 호스트의 빌드간에 약간 다를 것으로 예상됩니다.

또한 컴파일러 플래그 (예 : 명령 줄에서 #define)를 언급하지 않았습니다.

그러나 나는 처음에 파일이 뭔가하지 두 시스템에서 동일한 결론에 우리를 인도 같은 크기로 나올해야한다 생각합니다. 가장 가능성있는 후보는 시스템 헤더입니다 (OS 설치의 루트 수준 기능 하나만 있으면 이러한 파일을 완전히 다른 시각으로 볼 수 있음) 및 종속 라이브러리입니다.

g++ -E 또는 이와 유사한 것으로 사전 처리하여 헤더가 동일한 지 확인할 수 있습니다. 라이브러리 경로를 따라 링크 된 파일이 각 시스템에서 동일하다는 것을 확인할 수도 있습니다.

+0

일반적으로 오브젝트 파일에는 타임 스탬프와 운영 체제 및 컴파일러를 나타내는 문자열이 들어 있습니다. – vonbrand