분해 분석이 가능한 Linux 최소 실행 가능 예제
이것은 표준으로 지정되지 않은 구현 세부 사항이므로 컴파일러가 특정 구현에서 수행하는 작업을 살펴 보겠습니다.
이 답변에서는 분석을 수행하는 특정 답변에 연결하거나 여기에 직접 분석을 제공하고 여기에 모든 결과를 요약합니다.
그것들은 모두 다양한 Ubuntu / GCC 버전에 있으며 결과는 버전간에 상당히 안정적 일 수 있지만 변형이 발견되면보다 정확한 버전을 지정하십시오.
함수 내부의 지역 변수
그것이 main
아니면 다른 기능이 되십시오 :
void f(void) {
int my_local_var;
}
에서와 같이 어떤 GDB의 평균 <값은 밖으로 최적화>는 무엇입니까?
-O0
: 스택
-O3
: 유출되지 않으면 등록하고, 그렇지 않으면 스택
스택이 존재하는 이유에 대한 동기 부여 는 x86 어셈블리의 레지스터에 사용되는 푸시 / 팝 명령어의 기능은 무엇입니까?를 참조하십시오.
글로벌 변수 및 static
함수 변수
/* BSS */
int my_global_implicit;
int my_global_implicit_explicit_0 = 0;
/* DATA */
int my_global_implicit_explicit_1 = 1;
void f(void) {
/* BSS */
static int my_static_local_var_implicit;
static int my_static_local_var_explicit_0 = 0;
/* DATA */
static int my_static_local_var_explicit_1 = 1;
}
char *
과 char c[]
: 그림과 같이 C 및 C ++에 저장된 정적 변수?
void f(void) {
/* RODATA / TEXT */
char *a = "abc";
/* Stack. */
char b[] = "abc";
char c[] = {'a', 'b', 'c', '\0'};
}
TODO는 매우 큰 문자열 리터럴도 스택에 배치합니까? 아니면 .data
? 아니면 컴파일이 실패합니까?
함수 인수
void f(int i, int j);
관련 호출 규칙 (예 : X86의 경우 https://en.wikipedia.org/wiki/X86_calling_conventions) 을 따라야합니다. X86의 경우 각 변수의 특정 레지스터 또는 스택 위치를 지정합니다.
그런 다음 gdb에서 <값 최적화 됨>의 의미는 무엇입니까? , -O0
동안 다음, 스택에 모든 것을 slurps -O3
시도는 가능한 한 레지스터를 사용합니다.
그러나 함수가 인라인되면 일반 지역처럼 취급됩니다.
const
나는 당신이 그것을 캐스트 할 수 있기 때문에 아무런 차이가 없다고 생각합니다.
반대로, 컴파일러가 일부 데이터가 쓰여지지 않은 것으로 판단 할 수 .rodata
있다면 const가 아닌 경우에도 이론상으로 데이터를 배치 할 수 있습니다.
TODO 분석.
포인터
그것들은 변수 (주소를 포함하고 숫자입니다), 나머지와 동일합니다 :-)
Malloc
문제는 훨씬 이해가되지 않습니다 malloc
때문에, malloc
기능, 그리고 지역 :
int *i = malloc(sizeof(int));
*i
는 주소를 포함하는 변수이므로 위의 경우에 해당합니다.
malloc이 내부적으로 작동하는 방식에 관해서는 Linux 커널을 호출 할 때 내부 데이터 구조에서 특정 주소를 쓰기 가능으로 표시하고 처음에 프로그램에 의해 만지면 오류가 발생하고 커널은 페이지 테이블을 활성화하여 액세스 할 수 있습니다 segfaul없이 발생 : x86 페이징은 어떻게 작동합니까?
그러나 이것은 기본적으로 exec
실행 파일을 실행하려고 할 때 syscall이 후드에서 수행하는 것과 정확히 일치 합니다.로드하려는 페이지를 표시하고 거기에 프로그램을 작성합니다. 또한 다음을 참조하십시오. 커널에서 실행 가능한 이진 파일을 실행하는 방법 리눅스? exec
그것을로드 할 위치에 대한 추가 제한이 있습니다 (예 : 코드 를 재배치 할 수없는 경우 제외 ).
에 사용되는 정확한 콜이 malloc
입니다 mmap
현대 2020 구현에서, 과거에 brk
사용되었습니다 합니까 용의 malloc ()을 사용 BRK () 또는 mmap를 ()?
동적 라이브러리
기본적으로 mmap
메모리에 액세스하십시오 : /unix/226524/what-system-call-is-used-to-load-libraries-in-linux/462710#462710
envinroment 변수와 main
의argv
초기 스택 위 : /unix/75939/where-is-the-environment-string-actual-stored TODO 왜 .data에 있지 않습니까?