How Does C++ Linking Work in Practice? [Duplicate]
How Does C++ Linking Work in Practice? What I Am Looking for Is a Detailed Explanation About How the Linking Happens, and Not What Commands Do the Linking...
How does C++ linking work in practice? What I am looking for is a detailed explanation about how the linking happens, and not what commands do the linking.
There's already a similar question about compilation which doesn't go into too much detail: How does the compilation/linking process work?
3 Answers
EDIT: I have moved this answer to the duplicate:
This answer focuses on address relocation, which is one of the crucial functions of linking.
A minimal example will be used to clarify the concept.
Must Read
0) Introduction
Summary: relocation edits the .text section of object files to translate:
- object file address
- into the final address of the executable
This must be done by the linker because the compiler only sees one input file at a time, but we must know about all object files at once to decide how to:
- resolve undefined symbols like declared undefined functions
- not clash multiple
.textand.datasections of multiple object files
Prerequisites: minimal understanding of:
- x86-64 or IA-32 assembly
- global structure of an ELF file. I have made a tutorial for that
Linking has nothing to do with C or C++ specifically: compilers just generate the object files. The linker then takes them as input without ever knowing what language compiled them. It might as well be Fortran.
So to reduce the crust, let's study a NASM x86-64 ELF Linux hello world:
section .data
hello_world db "Hello world!", 10
section .text
global _start
_start:
; sys_write
mov rax, 1
mov rdi, 1
mov rsi, hello_world
mov rdx, 13
syscall
; sys_exit
mov rax, 60
mov rdi, 0
syscall
compiled and assembled with:
nasm -felf64 hello_world.asm # creates hello_world.o
ld -o hello_world.out hello_world.o # static ELF executable with no libraries
with NASM 2.10.09.