Local symbols : 내부 함수, static 전역변수 (지역변수와는 다름 -> stack에 생성되는 변수(.data section, .bss section 과 연결). 실행 시점과는 연관X)
// main.cintsum(int *a, int n)//array : global symbolint array[2] = {1, 2}
//main : global symbolintmain(){
// Linking을 하기전에는 sum이라는 함수의 주소를 알 수 없어서 비워둠// Linking이후에 sum.c에서 sum함수를 연결하고, sum의 주소를 입력해줌int val = sum(array, 2);
// val : stack에 생성(Linker 는 local variable에는 관여 X)return val;
}
// sum.c//sum : global symbolintsum(int *a, int n){
//(Linker 는 local variable에는 관여 X)int i, s = 0;
for(i = 0; i < n; i++){
s += a[i];
}
return s;
}
//symbols.cint time;
intfoo(int a){
int b = a + 1;
return b;
}
intmain(int argc, char* argv[]){
printf("%d\n", foo(5));
return0;
}
위 symbols.c에서 symbol table(global v, function, static local...)에 포함되는 변수는 어떤게 있을까?
Names:
time : global 변수
foo : 함수
a : 지역변수 (symbol table X)
b : 지역변수 (symbol table X)
argc : 지역변수 (symbol table X)
argv : 지역변수 (symbol table X)
main : 함수
printf : 함수
$ readelf -s symbols.o
gcc -c를 이용해 .o 파일을 만든 후, 위 코드를 이용해서 Symbol table을 확인할 수 있다.
staticint x = 15;
intf(){
staticint x = 17;
return x++;
}
intg(){
staticint x = 19;
return x += 14;
}
inth(){
return x += 27;
}
위 코드에서 x라는 변수가 많이 사용된다. f, g함수 내부에서 static int로 x를 선언해서 사용하고, h 함수에서도 x를 사용한다. 변수명이 같은 경우(f, g 함수 내부) x의 symbol은 x.1721, x.1724 같은 유니크한 심볼로 만들어 진다.(충돌 방지)
Strong : 초기화된 전역변수
Weak : 초기화되지 않은 전역변수, extern 으로 선언된 변수
만약 변수명이 같아 충돌이 일어난다면 Symbols Rules에 따라서 변수를 linking 한다
Rule1 : Strong 우선(가까이 있는 변수 우선 X), Strong 이 2개 이상이면 error
Rule2 : Weak만 여러개 있는 경우 : Weak 변수중 아무거나 사용(danger)