문제

설정은 다음과 같습니다.

내 동료에게는 GCC 4.3.3 크로스 컴파일러 (BuildRoot)가있는 Fedora X64_86 기계가 있습니다. 크로스 컴파일러가 동일한 우분투 9.04 x64_86 기계가 있습니다.

동료는 테스트 머신에서 작동하는 라이브러리 + 테스트 앱을 만들었고 동일한 라이브러리와 테스트 앱을 컴파일했으며 동일한 테스트 시스템에서 충돌합니다.

내가 알 수있는 한, GCC는 BuildRoot 컴파일 된 UCLIBC에 대해 구축되었으므로 동일한 코드, 동일한 컴파일러. 어떤 종류의 호스트 머신 차이가 크로스 컴파일에 영향을 미칩니 까?

모든 통찰력이 높아졌습니다.

업데이트 : 명확히하기 위해 컴파일러는 다음과 같습니다 동일한. 라이브러리 및 TestApp의 소스 코드는 다음과 같습니다 동일한. 유일한 차이점은 TestApp + Lib가 다른 기계에서 컴파일되었다는 것입니다.

도움이 되었습니까?

해결책

코드가 충돌하면 (SIGSEGV를 얻는다고 가정합니다) 버그가있는 것 같습니다. 매달려있는 포인터를 사용하거나 버퍼 경계를 작성하는 것과 같은 일종의 정의되지 않은 동작 일 가능성이 높습니다.

정의되지 않은 행동의 불행한 지점은 5월 일부 기계에서 작업하십시오. 나는 당신이 여기서 그런 이벤트를 경험하고 있다고 생각합니다. 버그를 찾으려고하면 어떤 일이 일어나는지 알게 될 것입니다 :-)

다른 팁

어떤 방식으로 충돌합니까? 보다 구체적으로, 출력을 제공하고, 반환 코드 등을 제공 할 수 있습니까? 유용한 printf ()의 일부를 연결해 보셨습니까?

그리고 여기에는 몇 가지 자세한 내용이 필요하다고 생각합니다.

  1. TestApp이 라이브러리로 연결됩니까?

  2. 라이브러리가 정적입니까 아니면 역동적입니까?

  3. 라이브러리가 라이브러리 검색 경로에 있거나 Ld.so.conf에 디렉토리를 추가 했습니까?

  4. 라이브러리 및 TestApp의 설치 절차를 따르고 있습니까?

  5. 두 라이브러리와 TestApps가 비트 포트와 호환됩니까? 당신은 그들이 될 것으로 기대합니까?

  6. 동일한 환경과 권한을 가진 동료와 동일한 사용자와 동일한 사용자와 함께 실행하고 있습니까?

확실히, 뭔가 동일하지 않습니다.

Objdump와 그 많은 옵션, 특히 -d를 사용하여 다른 점을 결정하십시오.

당신은 그것을 지적하지 않았으므로, 나는 binutils가 차이라고 생각합니다. 이것이 바로 바이너리 건물에 사용되는 도구 세트입니다. LD, AS 및 OBJDUMP가 포함됩니다.

크로스 컴파일러는 대상 아키텍처를 위해 자체 바이누투리 세트가 필요합니다. 그러나 GCC와 달리 Binutils 도구가 이중 부트 스트랩 빌드를 작성하고 단계를 확인한다고 생각하지 않으므로 원래 x86_64 빌드 환경과의 차이가이를 만들 수 있습니다.

ARM CrossCompiler를 사용하여 ARM 용 Binutils 패키지를 다시 만들려고합니다. 그것이 차이가 있는지 확인하십시오.

일반 x86 Gentoo Stage1에서도 본 것입니다. 부트 스트랩 시스템과 컴파일러를 설치하고 업데이트 한 후 Gentoo 사용자는 시스템 재건을 잘 권장합니다. 다시 업데이트 된 도구 사용.

대상 (테스트 기계)은 무엇입니까?

제공된 컴파일러를 사용하고 있습니까? 그들은 일반적으로 GCC에 적용되는 상당히 큰 패치 세트를 가지고 있습니다. 예를 들어 Gentoo는 약 20 개의 패치가 있으며 Fedora 및 Ubuntu는 그다지 다르지 않습니다. 그러나 모든 패치가 100% 정상은 아닙니다 .-( 따라서 컴파일러가 실제로 다를 수 있습니다.

배포에 대한 "바닐라"버전의 GCC를 찾을 수 있습니다. 어쩌면 트릭을 수행 할 수 있습니다.

나는 대학에서 비슷한 경험을 한 사람을 알고있었습니다. 기본적으로 동일한 기계 실험실에서 그의 프로젝트는 개발 상자에서 일했지만 교수 상자에서 끔찍하게 추락했습니다. 이들은 동일한 버전의 OS를 실행하는 동일한 아치 인 두 개의 기계였습니다.

그것은 어딘가에 비 초기의 포인터로 끓었다.

그는 다음과 같은 코드를 가지고있었습니다.

if(p == NULL) {
    p = f();
}

P는 힙에 할당 된 클래스의 구성원이기 때문에 가치는 효과적으로 무작위였으며 때로는 가끔은 널이었고, 실제로는 잘 작동하는 것입니다 ... 문제는 그 것이 었습니다. 때때로 그리고 on 약간 기계, P에 대한 메모리는 프로그램 시작시 Null이지만 Prof 's Box에서는 그렇지 않았습니다. 수정은 물론 p tp null을 올바르게 초기화하는 것이었고 모든 것이 잘되었습니다.

당신은 이와 같은 것을 경험하고있을 것입니다. 또는 어떤 유형의 정의되지 않은 행동 "그것은"어떤 이유로 든 전혀 또는 전혀 예상대로 작동하거나 전혀 작동하지 않을 수도있다 "고 말하는 멋진 방법입니다.

어둠 속에서 찌르는 것처럼, 나는 초기화되지 않은 변수를 찾을 것입니다. 모든 로컬 및 글로벌 변수에 값이 할당되어 있는지 확인하십시오. 생성자에게 모든 데이터 멤버에 대한 초기화기가있는 경우 이중 점검.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top