2017-12-13 19 views
0

필자가 이해하는 한 (잘못된 부분이 있으면 수정하십시오.) 컴파일러의 출력은 사용 된 아키텍처 버전, 컴파일러 및 운영 체제에 따라 다릅니다.다른 OS 버전의 컴파일러 출력

우분투 릴리스 16.04 x84-64를 사용하고 gcc 버전 5.4 (또는 예제의 경우 OS, arch, compiler의 다른 혼합)로 c 파일을 컴파일하면됩니다.

내가 지금까지 이해했듯이 동일한 아치 및 컴파일러 버전으로 동일한 우분투 릴리스로 동일한 c 파일을 컴파일한다면 동일한 어셈블리 코드를 생성해야합니다.

몇 번 시도해 본 후에 이것이 잘못된 것 같은 느낌을 받았는데, 어떻게 가능합니까?

컴파일러의 출력이 특정 OS의 릴리스에 의존합니까?

예제 중 하나는 https://github.com/tbuktu/libntru을 다른 우분투 버전에서 컴파일하고 다른 어셈블리를 수신하는 것입니다.

+0

컴파일러 출력도 최적화 플래그에 따라 달라지며 (* 많은 *가 있음). –

+0

서로 다른 OS 버전에서 정확히 동일한 컴파일러 버전을 사용하는 방법을 정확히 알았습니까? 그들은 다르게 구성 될 수 있습니까? 예 : [그들 중 하나는'--enable-default-pie'] (https://stackoverflow.com/questions/43367427/32-bit-absolute-addresses-no-longer-allowed-in-x86-64-linux/) 46493456 # 46493456), 또는'-fstack-protector'에 대한 다른 기본값은 무엇입니까? –

+0

정확히 asm을 어떻게 비교 했습니까? [gcc -O3 -S를 사용하여 컴파일러의 * 실제 * asm 출력을 얻었습니까?] (https://stackoverflow.com/questions/38552116/how-to-remove-noise-from-gcc-clang-assembly- 출력), 또는 링크 된 바이너리를 디스 어셈블 했습니까? 아니면 바이너리를'cmp' 같은 것으로 비교 했습니까? –

답변

2

서로 다른 OS의 기본 라이브러리가 서로 다른 버전으로 설치되어있을 수 있습니다 (최종 응용 프로그램에 링크되어 있음). 따라서 최종 결과는 약간 다를 수 있습니다.

+1

거의 모든 것이 링크되지 않은 동적 라이브러리를 사용합니다.이 라이브러리에 대한 * 헤더 *는 다른 기능 시그니처 또는 다른 유형을 포함 할 수 있습니다. 일반적으로 링크 된 유일한 추가 정보는 gcc와 함께 제공되는 CRT 시작 코드 ('/ usr/lib/crt * .o')뿐입니다. 어쨌든, 이것은 컴파일러의 asm 출력의 일부가 아니며 링커의 바이너리 출력의 일부입니다. –

1

일부 우분투 버전을 수행하는 경우 전반적인 아키텍처 차이가 테스트에 반영되지 않을 수도 있고 오랜 기간 동안 동일한 컴파일러 제품군을 사용하는 동일한 OS 제품군에서 변경되지 않을 수도 있으므로 차이점의 확률은 줄어 듭니다. 시각. 같은 배포판의 이전 버전을 얻는 것과 같은 차이점을 보게 될 가능성이있는 곳에서는 최신/최신 버전의 컴파일러가 apt-get로 직접 이식되거나 지원되지 않습니다. 어쩌면 당신은 그들에게 손을 빌려서 일하도록 할 수는 있지만, 특히 gcc는 상대적으로 최근의 이전 또는 이후 버전으로 빌드 된 코드가 너무 멀리 떨어져 있고 gcc가 gcc를 빌드하지 못한다는 점이 정말 나쁘다. 내가 처음 기대하는 것은 컴파일러의 차이점을보기 시작한 gcc 버전 차이 때문입니다.

더 나은 테스트는 간단한 .c 파일을 사용하고 모든 버전의 Windows 용 (해당 시스템 용으로 빌드 된 gcc의 동일한 버전 사용) 및 모든 버전의 우분투/linux를 빌드하는 것입니다. 차이점을보다 빨리 파악해야합니다.

두 개의 다른 컴파일러는 합리적인 규모의 프로젝트 또는 지식 기반의 작은 코드 샘플 인 llvm/clang 대 gcc와의 차이점을 보여야합니다. 동일한 컴파일러 또는 컴파일러 계열의 다른 버전은 정의에 따라 다소 시간이 지남에 따라 차이를 보여줄 것입니다. 6.x와 6.x + 1 gcc는 차이를 잘 보여줍니다. 어디에서 볼지 모르지만 자주는 아니지만 gcc 3.x와 gcc 비교 7.x는 테스트 결과에 따라 좁힐 수 있습니다.

차이점이 나타나는 것으로 예상되는 동일한 OS 및 시스템에서 컴파일러 차이점이 있습니다.

동일한 컴파일러를 사용하는 시스템 차이점에 차이가 나는 이유는 여러 가지가 있습니다.

그리고 위의 조합은 당연히 차이점을 나타냅니다.

큰 문제는 왜 교육자가 컴파일러, 컴파일러 설정 또는 운영 체제를 변경하더라도 동일한 C 소스 코드가 동일한 방식으로 작성되지 않아야한다는 것입니다. 위의 내용 중 하나를 기반으로 차이가 없거나 큰 차이가있을 수 있습니다. 최적화 및 기타 튜닝 설정으로 아주 간단히 시작하여 거기에서부터 시작하십시오.

+0

BTW 이것은 여러 번 stackoverflow에 대한 질문과 대답이 있습니다. –