64비트에서 32비트 아키텍처 크로스 컴파일(FreeBSD)

64비트에서 32비트 아키텍처 크로스 컴파일(FreeBSD)

64비트 FreeBSD 시스템에서 32비트 FreeBSD 아키텍처용 라이브러리를 크로스 컴파일하는 데 문제가 있습니다. 어떤 조언/조언이라도 기꺼이 받아보겠습니다. 동일한 아키텍처(64비트)에 대해 컴파일하면 정상적으로 작동합니다.

포트 lang/gcc9 및 lang/gcc9-devel을 구축했습니다. 포트 구성에서 32비트와 64비트 모두에 대해 빌드해야 하는 "multilib"를 활성화했습니다. 내 시스템에서 사용 가능한 libstdc를 검색하면 다음을 찾을 수 있습니다.

[root@build /usr/local/share/ohNet-build4FreeBSD/ohNet-ohNet_1.17.2776]# find / -iname "*libstdc*"
/usr/local/share/gcc-9.2.0/python/libstdcxx
/usr/local/lib32/gcc9/libstdc++.so.6.0.27
/usr/local/lib32/gcc9/libstdc++.so
/usr/local/lib32/gcc9/libstdc++.so.6
/usr/local/lib32/gcc9/libstdc++.so.6.0.27-gdb.py
/usr/local/lib32/gcc9/libstdc++.a
/usr/local/lib32/gcc9/libstdc++fs.a
/usr/local/lib/gcc9/libstdc++.so.6.0.27
/usr/local/lib/gcc9/libstdc++fs.a
/usr/local/lib/gcc9/libstdc++.so.6
/usr/local/lib/gcc9/libstdc++.so
/usr/local/lib/gcc9/libstdc++.a
/usr/local/lib/gcc9/libstdc++.so.6.0.27-gdb.py
/usr/ports/lang/libstdc++_stldoc_4.2.2

64비트용으로 컴파일하면 프로젝트가 제대로 빌드됩니다. 32비트용으로 컴파일할 때 다음 환경 변수를 설정했습니다.

export CROSS_COMPILE_CFLAGS=-m32
export CROSS_COMPILE_LINKFLAGS=-m32

그리고 빌드가 실패합니다

/usr/local/bin/ld: skipping incompatible /usr/local/lib/gcc9/gcc/x86_64-portbld-freebsd11.2/9.2.1/../../../libstdc++.a when searching for -lstdc++
/usr/local/bin/ld: cannot find -lstdc++

내가 올바르게 이해했다면 컴파일러는 호환 가능한 32비트 라이브러리가 있지만 찾을 수 없습니다(위 참조). 이 문제를 해결하는 올바른 방법을 알려주십시오.

답변1

늦었다는 걸 알지만, 나 또한 이 문제에 부딪혔고 좋은 해결책을 찾는 데 어려움을 겪고 있습니다. GCC를 사용할 때 자체 라이브러리 경로를 찾을 수 없는 것 같습니다 -m32. 주요 문제는 FreeBSD가 libc++FreeBSD 11로 다시 전환하여 stdc++더 이상 사용할 수 없다는 것입니다.

내가 작동하게 할 수있는 유일한 방법은 다음과 같습니다.

  1. .Honestly 로 컴파일하면 GCC가 잘못된 라이브러리 경로로 LD를 호출하려고 한다는 것을 -B/usr/lib32 -B/usr/local/lib32/gcc9/런타임에서 보여주기 때문에 이는 GCC의 버그처럼 보입니다 . g++ main.cpp -v이 두 플래그는 이를 수정합니다. 첫 번째는 GCC 7 이하에서만 필요합니다(GCC 8 이상에서는 /usr/lib32에서 볼 수 있습니다). 다음 버전은 G++의 모든 버전에 필요합니다. gcc9실제로 GCC와 함께 제공되는 버전으로 교체하세요.
  2. 프로그램이 컴파일되지만 런타임 시 찾을 수 없습니다 libstdc++.so.6. 사용하거나 -static-libstdc++(내 플러그인 기반 프로그램에는 좋은 옵션이 아닙니다. 30개 DLL 모두 1MB만 증가했습니다.) 이름에도 불구하고 x86 및 amd64 compat9x-amd64버전을 추가하는 설치를 선택하세요. 경로를 표시하려면 libstdc++.so.6재부팅하거나 다시 실행해야 합니다 . ldconfigGCC는 AMD64 라이브러리에 대해 ldconfig에 구성 파일을 추가하지만 lib32에 대한 구성 파일은 없기 때문에 이는 GCC의 버그처럼 보입니다(ldconfig32 전용 시스템이 있음에도 불구하고). 이 compat9x패키지는 libstdc++를 제공하며 ldconfig 구성 파일도 추가합니다.

이 설정을 사용하여 프로그램을 성공적으로 구축했지만 여전히 FreeBSD의 multilib 지원이 매우 열악하다고 생각합니다(많은 Linux 배포판은 더 나은 multilib 지원을 제공하며 32비트 및 64비트 라이브러리를 나란히 설치할 수 있습니다. 데비안의 라이브러리와 일부 다른 배포판에는 멀티 아키텍처도 지원됩니다. AMD64의 arm 및 powerpc와 같은 기본 아키텍처와 병렬로 외부 아키텍처에 대한 크로스 컴파일을 추가할 수도 있습니다.

관련 정보