官术网_书友最值得收藏!

All about linking

Linking is an extremely complex topic that varies from operating system to operating system. For example, Windows links programs quite differently to Linux. For this reason, we will limit our discussion to Linux. 

When a C source file is compiled, it is compiled into what is called an object file, which contains the compiled source code with each function that is defined in the program in a binary format, as follows:

> gcc -c scratchpad.c; objdump -d scratchpad.o

...

0000000000000000 <main>:
0: 55 push %rbp
1: 48 89 e5 mov %rsp,%rbp
4: 48 8d 3d 00 00 00 00 lea 0x0(%rip),%rdi # b <main+0xb>
b: e8 00 00 00 00 callq 10 <main+0x10>
10: b8 00 00 00 00 mov $0x0,%eax
15: 5d pop %rbp
16: c3 retq

As shown here, the compiler creates an object file, which contains the compiler (that is, binary) version of the source code. An important note here is that that the main() function is labeled main, in plain text.

Let's expand this example to include another function:

int test(void)
{
return 0;
}

int main(void)
{
return test();
}

Compiling this source, we get the following:

> gcc -c scratchpad.c; objdump -d scratchpad.o

...

0000000000000000 <test>:
0: 55 push %rbp
1: 48 89 e5 mov %rsp,%rbp
4: b8 00 00 00 00 mov $0x0,%eax
9: 5d pop %rbp
a: c3 retq

000000000000000b <main>:
b: 55 push %rbp
c: 48 89 e5 mov %rsp,%rbp
f: e8 00 00 00 00 callq 14 <main+0x9>
14: 5d pop %rbp
15: c3 retq

As shown here, each function that is compiled is labeled using the same name as the function. That is, the name of each function is not mangled (unlike in C++). Name mangling will be explained in further detail in the next section, as well as why this is important with respect to linking. 

Going beyond a simple source file, a C program is split into groups of source files that are compiled and linked together. Specifically, an executable is the combination of object files and libraries. Libraries are a combination of additional object files, divided into two different types:

  • Static libraries: libraries that are linked at compile time
  • Dynamic libraries: libraries that are linked at load time
主站蜘蛛池模板: 新安县| 新郑市| 乐陵市| 罗甸县| 儋州市| 焦作市| 通榆县| 昂仁县| 夏邑县| 太仓市| 朝阳县| 宁乡县| 扬州市| 沧源| 利津县| 平陆县| 波密县| 新巴尔虎右旗| 班玛县| 赣榆县| 兰西县| 衡山县| 双流县| 凤山市| 广灵县| 东辽县| 屯门区| 昂仁县| 咸宁市| 台中县| 长顺县| 长垣县| 肇源县| 东辽县| 恭城| 塔城市| 咸阳市| 南召县| 克山县| 民和| 平安县|