차이
문서의 선택한 두 판 사이의 차이를 보여줍니다.
양쪽 이전 판 이전 판 다음 판 | 이전 판 | ||
linuxfromscratch:12.1:098-gcc-13.2.0 [2024/05/19 14:18] – baecy | linuxfromscratch:12.1:098-gcc-13.2.0 [2024/06/15 11:43] (현재) – [8.28.1. GCC 설치] baecy | ||
---|---|---|---|
줄 1: | 줄 1: | ||
^ Linux From Scratch - Version 12.1-systemd | ^ Linux From Scratch - Version 12.1-systemd | ||
^ Chapter 8. Installing Basic System Software | ^ Chapter 8. Installing Basic System Software | ||
- | |[[.: | + | |[[.: |
|Shadow-4.14.5 | |Shadow-4.14.5 | ||
줄 9: | 줄 9: | ||
===== 8.28. GCC-13.2.0 ===== | ===== 8.28. GCC-13.2.0 ===== | ||
- | GCC 패키지에는 C 컴파일러와 C++ 컴파일러가 포함된 GNU 컴파일러 컬렉션이 포함되어 있습니다. | + | GCC 패키지에는 C 컴파일러와 |
- | **대략적인 | + | * **빌드 시간:** 42 SBU (테스트 포함) |
- | **필요한 | + | |
---- | ---- | ||
줄 33: | 줄 33: | ||
<code bash> | <code bash> | ||
mkdir -v build | mkdir -v build | ||
- | cd build | + | cd |
</ | </ | ||
줄 52: | 줄 52: | ||
GCC는 7가지 컴퓨터 언어를 지원하지만 대부분의 컴퓨터 언어에 대한 전제 조건이 되는 패키지가 아직 설치되지 않았습니다. GCC에서 지원되는 모든 언어를 빌드하는 방법에 대한 지침은 [[https:// | GCC는 7가지 컴퓨터 언어를 지원하지만 대부분의 컴퓨터 언어에 대한 전제 조건이 되는 패키지가 아직 설치되지 않았습니다. GCC에서 지원되는 모든 언어를 빌드하는 방법에 대한 지침은 [[https:// | ||
- | === 새로운 구성 매개 변수의 의미 | + | === configure 옵션 설명 |
- | * //LD=ld// \\ 구성 스크립트에서 교차 | + | * //LD=ld// \\ 크로스 |
* // | * // | ||
- | * // | + | * // |
<WRAP info center round 90%> | <WRAP info center round 90%> | ||
- | **참고** \\ PIE(위치 독립 실행 파일)는 메모리 어디에서나 로드할 수 있는 바이너리 프로그램입니다. PIE를 사용하지 않으면 | + | **참고** \\ [[wpko> |
- | SSP(스택 스매싱 보호)는 매개변수 스택이 손상되지 않도록 하는 기술입니다. 예를 들어 스택이 손상되면 서브루틴의 반환 주소가 변경되어 프로그램이나 공유 라이브러리에 존재하거나 공격자가 어떤 식으로든 삽입한 위험한 코드로 제어권이 이전될 수 있습니다. | + | 스택 스매싱 보호(SSP)는 매개변수 스택이 손상되지 않도록 하는 기술입니다. 예를 들어 스택이 손상되면 서브루틴의 반환 주소가 변경되어 프로그램이나 공유 라이브러리에 존재하거나 공격자가 어떤 식으로든 삽입한 위험한 코드로 제어권이 이전될 수 있습니다. |
</ | </ | ||
- | 패키지를 컴파일합니다: | + | 패키지를 컴파일합니다. |
<code bash> | <code bash> | ||
줄 71: | 줄 71: | ||
<WRAP important center round 90%> | <WRAP important center round 90%> | ||
- | **중요** \\ 이 섹션에서는 | + | **중요** \\ GCC용 테스트 스위트는 매우 중요하지만 시간이 오래 걸립니다. |
</ | </ | ||
줄 87: | 줄 87: | ||
</ | </ | ||
- | 테스트 스위트 결과의 요약을 추출하려면 다음을 실행합니다: | + | 테스트 스위트 결과의 요약을 추출하려면 다음을 실행합니다. |
- | <codd bash> | + | <code bash> |
../ | ../ | ||
</ | </ | ||
줄 97: | 줄 97: | ||
결과는 [[https:// | 결과는 [[https:// | ||
- | 8개의 gcc 테스트(185, | + | 8개의 gcc 테스트(185, |
예상치 못한 몇 가지 실패를 항상 피할 수는 없습니다. GCC 개발자는 일반적으로 이러한 문제를 알고 있지만 아직 해결하지 못했습니다. 테스트 결과가 위 URL의 테스트 결과와 크게 다르지 않는 한 계속 진행해도 안전합니다. | 예상치 못한 몇 가지 실패를 항상 피할 수는 없습니다. GCC 개발자는 일반적으로 이러한 문제를 알고 있지만 아직 해결하지 못했습니다. 테스트 결과가 위 URL의 테스트 결과와 크게 다르지 않는 한 계속 진행해도 안전합니다. | ||
- | 패키지를 설치합니다: | + | 패키지를 설치합니다. |
<code bash> | <code bash> | ||
줄 114: | 줄 114: | ||
</ | </ | ||
- | "역사적인" | + | "관습적인" |
<code bash> | <code bash> | ||
줄 120: | 줄 120: | ||
</ | </ | ||
- | 많은 패키지가 C 컴파일러를 호출할 때 cc라는 이름을 사용합니다. 우리는 이미 gcc-pass2에서 cc를 심볼릭 링크로 만들었으므로, | + | 많은 패키지가 C 컴파일러를 호출할 때 cc라는 이름을 사용합니다. 우리는 이미 gcc-pass2에서 cc를 심볼릭 링크로 만들었으므로, |
<code bash> | <code bash> | ||
줄 126: | 줄 126: | ||
</ | </ | ||
- | 호환성 심볼릭 링크를 추가하여 링크 시간 최적화(LTO)로 프로그램을 빌드할 수 있도록 합니다: | + | 호환성 심볼릭 링크를 추가하여 링크 시 최적화(LTO)로 프로그램을 빌드할 수 있도록 합니다. |
<code bash> | <code bash> | ||
줄 133: | 줄 133: | ||
</ | </ | ||
- | 이제 최종 툴체인이 준비되었으므로 컴파일과 링킹이 예상대로 작동하는지 다시 한 번 확인하는 것이 중요합니다. 이를 위해 몇 가지 정상 검사를 수행합니다: | + | 이제 최종 툴체인이 준비되었으므로 컴파일과 링킹이 예상대로 작동하는지 다시 한 번 확인하는 것이 중요합니다. 이를 위해 몇 가지 정상 검사를 수행합니다. |
- | 오류가 없어야 하며 마지막 명령의 출력은 다음과 같아야 합니다(동적 링커 이름에 플랫폼별 차이가 있을 수 있음): | + | 오류가 없어야 하며 마지막 명령의 출력은 다음과 같아야 합니다(동적 링커 이름에 플랫폼별 차이가 있을 수 있음). |
<code bash cmdout=4 user=root host=lfs> | <code bash cmdout=4 user=root host=lfs> | ||
줄 141: | 줄 141: | ||
cc dummy.c -v -Wl, | cc dummy.c -v -Wl, | ||
readelf -l a.out | grep ': /lib' | readelf -l a.out | grep ': /lib' | ||
- | [Requesting program interpreter: | + | [Requesting program interpreter: |
- | </ | + | |
이제 올바른 시작 파일을 사용하도록 설정되어 있는지 확인합니다. | 이제 올바른 시작 파일을 사용하도록 설정되어 있는지 확인합니다. | ||
줄 151: | 줄 150: | ||
/ | / | ||
/ | / | ||
- | / | + | / |
- | </ | + | |
머신 아키텍처에 따라 위의 내용은 약간 다를 수 있습니다. 차이점은 ''/ | 머신 아키텍처에 따라 위의 내용은 약간 다를 수 있습니다. 차이점은 ''/ | ||
줄 162: | 줄 160: | ||
<code bash cmdout=2-6 user=root host=lfs> | <code bash cmdout=2-6 user=root host=lfs> | ||
grep -B4 '^ / | grep -B4 '^ / | ||
- | #include <...> search starts here: | + | #include <...> search starts here. |
/ | / | ||
/ | / | ||
/ | / | ||
- | / | + | / |
- | </ | + | |
다시 말하지만, | 다시 말하지만, | ||
- | 다음으로 새 링커가 올바른 검색 경로와 함께 사용되고 있는지 확인합니다: | + | 다음으로 새 링커가 올바른 검색 경로와 함께 사용되고 있는지 확인합니다. |
경로에 ' | 경로에 ' | ||
줄 183: | 줄 180: | ||
SEARCH_DIR("/ | SEARCH_DIR("/ | ||
SEARCH_DIR("/ | SEARCH_DIR("/ | ||
- | SEARCH_DIR("/ | + | SEARCH_DIR("/ |
- | </ | + | |
32비트 시스템에서는 몇 가지 다른 디렉터리를 사용할 수 있습니다. 예를 들어 다음은 i686 컴퓨터의 출력입니다. | 32비트 시스템에서는 몇 가지 다른 디렉터리를 사용할 수 있습니다. 예를 들어 다음은 i686 컴퓨터의 출력입니다. | ||
줄 197: | 줄 193: | ||
SEARCH_DIR("/ | SEARCH_DIR("/ | ||
SEARCH_DIR("/ | SEARCH_DIR("/ | ||
- | SEARCH_DIR("/ | + | SEARCH_DIR("/ |
- | </ | + | |
다음으로 올바른 libc를 사용하고 있는지 확인합니다. | 다음으로 올바른 libc를 사용하고 있는지 확인합니다. | ||
줄 206: | 줄 201: | ||
<code bash host=lfs user=root cmdout=2> | <code bash host=lfs user=root cmdout=2> | ||
grep "/ | grep "/ | ||
- | attempt to open / | + | attempt to open / |
- | </ | + | |
GCC가 올바른 동적 링커를 사용하고 있는지 확인합니다. | GCC가 올바른 동적 링커를 사용하고 있는지 확인합니다. | ||
줄 213: | 줄 207: | ||
<code bash host=lfs user=root cmdout=2> | <code bash host=lfs user=root cmdout=2> | ||
grep found dummy.log | grep found dummy.log | ||
- | found ld-linux-x86-64.so.2 at / | + | found ld-linux-x86-64.so.2 at / |
- | </ | + | |
위와 같이 출력이 나타나지 않거나 아무것도 출력되지 않는다면 심각한 문제가 있는 것입니다. 각 단계를 조사하고 역추적하여 문제의 원인을 찾아서 해결하세요. 계속 진행하기 전에 모든 문제를 해결해야 합니다. | 위와 같이 출력이 나타나지 않거나 아무것도 출력되지 않는다면 심각한 문제가 있는 것입니다. 각 단계를 조사하고 역추적하여 문제의 원인을 찾아서 해결하세요. 계속 진행하기 전에 모든 문제를 해결해야 합니다. | ||
- | 모든 것이 올바르게 작동하면 테스트 파일을 정리합니다: | + | 모든 것이 올바르게 작동하면 테스트 파일을 정리합니다. |
<code bash> | <code bash> | ||
줄 224: | 줄 217: | ||
</ | </ | ||
- | 마지막으로 잘못 배치된 파일을 이동합니다: | + | 마지막으로 잘못 배치된 파일을 이동합니다. |
<code bash> | <code bash> | ||
줄 233: | 줄 226: | ||
---- | ---- | ||
- | ==== 8.28.2. GCC의 내용 | + | ==== 8.28.2. GCC 패키지 구성 |
* **설치된 프로그램: | * **설치된 프로그램: | ||
줄 239: | 줄 232: | ||
* **설치된 디렉터리** \\ / | * **설치된 디렉터리** \\ / | ||
- | === 간단한 설명 === | + | === 간략한 설명=== |
* **c++** \\ C++ 컴파일러 | * **c++** \\ C++ 컴파일러 | ||
줄 263: | 줄 256: | ||
* liblsan \\ Leak Sanitizer 런타임 라이브러리 | * liblsan \\ Leak Sanitizer 런타임 라이브러리 | ||
* liblto_plugin \\ Binutils가 LTO가 활성화된 상태에서 GCC에서 생성된 객체 파일을 처리할 수 있도록 하는 GCC의 LTO 플러그인 | * liblto_plugin \\ Binutils가 LTO가 활성화된 상태에서 GCC에서 생성된 객체 파일을 처리할 수 있도록 하는 GCC의 LTO 플러그인 | ||
- | * libquadmath \\ GCC [[wpkr> | + | * libquadmath \\ GCC [[wpko> |
* libssp \\ GCC의 SSP((stack-smashing protection)) 기능을 지원하는 루틴이 포함되어 있습니다. Glibc에서도 이러한 루틴을 제공하기 때문에 일반적으로는 사용되지 않습니다. | * libssp \\ GCC의 SSP((stack-smashing protection)) 기능을 지원하는 루틴이 포함되어 있습니다. Glibc에서도 이러한 루틴을 제공하기 때문에 일반적으로는 사용되지 않습니다. | ||
* libstdc++ \\ 표준 C++ 라이브러리 | * libstdc++ \\ 표준 C++ 라이브러리 |