티스토리 뷰

$ cat a.c
#include <stdio.h>
int noinit_global_var;
int init_global_var = 0;
static int static_var;
static int init_static_var = 0;
int func() {
	static int func_static_var;
    return 0;
}

$ gcc -c -o a1.o a.c
$ g++ -c -o a2.o a.c

$ nm a1.o
00000000 T func
00000008 b func_static_var.0
00000000 B init_global_var
00000004 b init_static_var
00000004 C noinit_global_var
0000000c b static_var

$ nm a2.o
00000000 T _Z4funcv
00000010 b _ZZ4funcvE15func_static_var
00000004 B init_global_var
0000000c b init_static_var
00000000 B noinit_global_var
00000008 b static_var

$ nm -C a2.o
00000000 T func()
00000010 b func()::func_static_var
00000004 B init_global_var
0000000c b init_static_var
00000000 B noinit_global_var
00000008 b static_var

C와 C++에서 초기화 되지 않은 전역 변수를 다루는데 gnu c/c++ 컴파일러는 각각 다른 코드를 만들어 낸다. 각각을 보면 C에서는 "C" 즉 COMMON으로 만들고 C++에서는 "B" 즉 BSS 영역의 데이터로 만들어 낸다. C와 B의 차이를 nm의 info 페이지에서 찾아 보면,

$ info nm

`B' The symbol is in the uninitialized data section (known as BSS).
`C' The symbol is common. Common symbols are uninitialized data.
When linking, multiple common symbols may appear with the same name.
If the symbol is defined anywhere, the common symbols are treated
as undefined references.

For more details on common symbols, see the discussion of
-warn-common in *Note Linker options: (ld.info)Options.


이런 차이가 있으니, C 에서는 두 개의 파일이 초기화하지 않은 전역 변수를 외부로 노출할 경우 아무런 문제없이 링크되나 C++에서는 그렇지 않게 된다.

반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함