- Hands-On System Programming with C++
- Dr. Rian Quinn
- 375字
- 2021-07-02 14:42:32
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
- 我們都是數據控:用大數據改變商業、生活和思維方式
- Access 2016數據庫教程(微課版·第2版)
- 從零開始學Hadoop大數據分析(視頻教學版)
- 企業大數據系統構建實戰:技術、架構、實施與應用
- 文本數據挖掘:基于R語言
- 工業大數據分析算法實戰
- UDK iOS Game Development Beginner's Guide
- 大數據:從概念到運營
- Remote Usability Testing
- Starling Game Development Essentials
- gnuplot Cookbook
- 重復數據刪除技術:面向大數據管理的縮減技術
- 科研統計思維與方法:SPSS實戰
- Splunk智能運維實戰
- Hands-On System Programming with C++