ucore-project5: linker script
2179 단어 project
링크 기능이 매우 강해서 링크기가 어떻게 일을 해야 하는지 알려줄 수 있다. 링크기의 시작 코드 주소가 어디에 있는지, 어떤 cpu 기계 유형인지 알려주는 것 외에 가장 중요한 것은 링크기 각 파일의 각각section이 어떻게 조합되어야 하는지 알려주는 것이다. 어느 주소부터 넣어야 하는지, 각section은 어떤 순서로 놓아야 하는지, 각각 어떻게 정렬해야 하는지 등이다. 최종적으로 출력 파일을 구성하는 각각section
이 밖에 링크러 스크립트는 각종 기호를 정의하여 최종적으로 생성된 기호표에 넣을 수 있다.기호표는 기호의 목록으로 각 기호는 기호의 이름, 기호가 인용하는 메모리 주소, 그리고 기타 속성 정보를 포함한다.기호 자체는 프로그램의 메모리 공간을 차지하지 않고 실제로는 하나의 주소의 기호 표시이다.
C 언어에서 변수를 정의할 때 실제로는 두 가지 일을 했다. 1.하나의 기호를 정의하여 최종적으로 기호표에 넣고 그 주소를 연결한다.2. 이 변수에 메모리 공간을 분배하여 접근할 수 있습니다.예를 들면 다음과 같습니다.
int a;
a = 10;
printf("%d
", a);
int *pa = &a;
int a;변수를 정의했습니다. 먼저 기호표에 기호 a를 만들고 a에 대응하는 주소를 저장한 다음에 메모리 공간에 a에 int 크기의 공간을 남겼습니다. 공간의 주소는 기호표에 대응하는 a의 주소로 지정됩니다.
두 번째 줄 a=10;기호 a가 대표하는 주소가 가리키는 int 크기의 메모리 공간에 10을 부여하고 세 번째 줄은 기호 a가 대표하는 주소가 가리키는 int 크기의 메모리 공간에 있는 데이터를 인용한다.
네 번째 줄 & a는 기호표에서 기호 a에 대응하는 주소를 직접 추출하는 값으로 이 값은 메모리의 실제 데이터와 상관없이 링크를 컴파일하는 동안 확정할 수 있다. (물론 본 예에서 a는 국부 변수이고 그 주소는 운행 기간이 확정되며 정적 변수와 전역 변수의 주소 컴파일러가 확정한다.)
linker script에 정의된 기호는 기호표의 기호일 뿐 대응하는 메모리 공간이 없고 주소 값만 표시합니다.따라서 linker script에 두 개의 기호가 정의되어 있는 경우
.text :
{
_text_begin = .;
*(.text)
_text_end = .;
}
코드에서 다음과 같은 액세스가 잘못되었습니다.
extern int _begin_text, _end_text;
int a = _end_text - _begin_text;
위 참조begin_text 및end_text의 방식은 변수의 접근 방식을 사용하고 변수에 대응하는 메모리에 직접 접근하는 것이다. 실제로 이런 기호는 메모리에 대응하는 값이 없다.다음은 올바른 액세스입니다.
extern int _begin_text, _end_text;
int a = &_end_text - &_begin_text;
또한 그룹 이름은 사실상 하나의 기호 값으로 직접 가져와서 사용할 수 있으며 다음과 같은 접근도 정확하다.
extern char _begin_text[], _end_text[];
int a = _end_text - _begin_text;
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Personal analysis of the Daily project on GitHubAnalysis of other people's projects on github. Learn from him well. https://github.com/spring2613/Daily The project has ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.