# Linker (ivss) A **linker** combines assembled objects, connects symbol references with definitions, and assigns section addresses. In ivss, its output still contains relocation records for the emulator to apply while loading: ```bash $ ./linker -hex \ -place=my_code@0x40000000 \ -o program.hex \ main.o data.o ``` Both inputs must use the assembler's `-hex` serialization. The placement option puts the code at the emulator's initial program counter. Without `-hex`, the linker writes a descriptive dump instead of loader-readable serialized bytes. The linker merges section contents, updates symbols and relocation indices, then assigns addresses. A load referring to data in another object can therefore remain independent of that object's eventual location. [[ivss-section-merging|Section merging]] determines offsets within combined sections; [[ivss-symbol-resolution|symbol resolution]] connects names. [[ivss-section-placement|Placement]] supplies section bases. Final [[ivss-relocation-processing|patching]] happens in `Mem_LoadElf()`, rather than being completed by this command alone. The resulting file is intended for the ivss emulator, not native execution by the host operating system. Source: [linker.c](https://github.com/yanevskiv/ivss/blob/main/src/linker.c).