In
software development
Software development is the process of designing and Implementation, implementing a software solution to Computer user satisfaction, satisfy a User (computing), user. The process is more encompassing than Computer programming, programming, wri ...
, relocation is the process of assigning load addresses for
position-dependent code
In computing, position-independent code (PIC) or position-independent executable (PIE) is a body of machine code that executes properly regardless of its memory address. PIC is commonly used for shared libraries, so that the same library code ...
and data of a program and adjusting the code and data to reflect the assigned addresses.
A
linker
Linker or linkers may refer to:
Computing
* Linker (computing), a computer program that takes one or more object files generated by a compiler or generated by an assembler and links them with libraries, generating an executable program or shar ...
usually performs relocation in conjunction with ''symbol resolution'', the process of searching files and libraries to replace symbolic references or names of
libraries
A library is a collection of Book, books, and possibly other Document, materials and Media (communication), media, that is accessible for use by its members and members of allied institutions. Libraries provide physical (hard copies) or electron ...
with actual usable addresses in
memory
Memory is the faculty of the mind by which data or information is encoded, stored, and retrieved when needed. It is the retention of information over time for the purpose of influencing future action. If past events could not be remembe ...
before running a program.
Relocation is typically done by the linker at
link time
In computer science, link time refers to the period of time, during the creation of a computer program, in which a linker is being applied to that program. Link time occurs after compile time and before runtime (when a program is executed).
It ...
, but it can also be done at
load time by a relocating
loader, or at
run time by the running program
itself.
Segmentation
Object file
An object file is a file that contains machine code or bytecode, as well as other data and metadata, generated by a compiler or assembler from source code during the compilation or assembly process. The machine code that is generated is kno ...
s are typically segmented into various memory segment or section types. Example segment types include
code segment (.text),
initialized data segment (.data),
uninitialized data segment (.bss), or others as established by the programmer, such as common segments, or named static segments.
Relocation table
The relocation table is a list of addresses created by a
compiler
In computing, a compiler is a computer program that Translator (computing), translates computer code written in one programming language (the ''source'' language) into another language (the ''target'' language). The name "compiler" is primaril ...
or
assembler and stored in the object or executable file. Each entry in the table references an absolute address in the object code that must be changed when the loader relocates the program so that it will refer to the correct location. Entries in the relocation table are known as ''fixups'' and are designed to support relocation of the program as a complete unit. In some cases, each fixup in the table is itself relative to a base address of zero, so the fixups themselves must be changed as the loader moves through the table.
In some architectures, a fixup that crosses certain boundaries (such as a segment boundary) or that is not aligned on a word boundary is illegal and flagged as an error by the linker.
DOS and 16-bit Windows
Far
pointers (
32-bit
In computer architecture, 32-bit computing refers to computer systems with a processor, memory, and other major system components that operate on data in a maximum of 32- bit units. Compared to smaller bit widths, 32-bit computers can perform la ...
pointers with
segment:offset, used to address 20-bit 640
KB memory space available to
DOS
DOS (, ) is a family of disk-based operating systems for IBM PC compatible computers. The DOS family primarily consists of IBM PC DOS and a rebranded version, Microsoft's MS-DOS, both of which were introduced in 1981. Later compatible syste ...
programs), which point to code or data within a
DOS executable
The DOS MZ executable format is the executable file format used for .EXE files in DOS.
The file can be identified by the ASCII string "MZ" (hexadecimal: 4D 5A) at the beginning of the file (the "Magic number (programming), magic number"). "MZ" ...
(
EXE
Exe or EXE may refer to:
* .exe, a file extension
* exe., abbreviation for Executive (disambiguation)#Role, title, or function, executive
Places
* River Exe, in England
* Exe Estuary, in England
* Exe Island, in Exeter, England
Transportation a ...
), do not have absolute segments, because the actual address of code or data depends on where the program is loaded in memory and this is not known until the program is loaded.
Instead, segments are relative values in the DOS EXE file. These segments need to be corrected, when the executable has been loaded into memory. The EXE
loader uses a relocation table to find the segments that need to be adjusted.
32-bit Windows
With 32-bit Windows operating systems, it is not mandatory to provide relocation tables for EXE files, since they are the first image loaded into the virtual address space and thus will be loaded at their preferred base address.
For both
DLLs and for EXEs which opt into
address space layout randomization
Address space layout randomization (ASLR) is a computer security technique involved in preventing exploitation of memory corruption vulnerabilities. In order to prevent an attacker from reliably redirecting code execution to, for example, a pa ...
(ASLR), an
exploit mitigation technique introduced with
Windows Vista
Windows Vista is a major release of the Windows NT operating system developed by Microsoft. It was the direct successor to Windows XP, released five years earlier, which was then the longest time span between successive releases of Microsoft W ...
, relocation tables once again become mandatory because of the possibility that the binary may be dynamically moved before being executed, even though they are still the first thing loaded in the virtual address space.
64-bit Windows
When running native 64-bit binaries on Windows Vista and above, ASLR is mandatory, and thus relocation sections cannot be omitted by the compiler.
Unix-like systems
The
Executable and Linkable Format
In computing, the Executable and Linkable FormatTool Interface Standard (TIS) Portable Formats SpecificationVersion 1.1'' (October 1993) (ELF, formerly named Extensible Linking Format) is a common standard file format for executable files, obje ...
(ELF) executable format and shared library format used by most Unix-like systems allows several types of relocation to be defined.
Relocation procedure
The linker reads segment information and relocation tables in the object files and performs relocation by:
* merging all segments of common type into a single segment of that type
* assigning unique run time addresses to each section and each symbol, giving all code (functions) and data (global variables) unique run time addresses
* referring to the relocation table to modify symbol references so that they point to the correct run time addresses.
Example
The following example uses
Donald Knuth
Donald Ervin Knuth ( ; born January 10, 1938) is an American computer scientist and mathematician. He is a professor emeritus at Stanford University. He is the 1974 recipient of the ACM Turing Award, informally considered the Nobel Prize of comp ...
's
MIX architecture and MIXAL assembly language. The principles are the same for any architecture, though the details will change.
* (A) Program ''SUBR'' is compiled to produce object file (B), shown as both machine code and assembler. The compiler may start the compiled code at an arbitrary location, often location 1 as shown. Location 13 contains the machine code for the jump instruction to statement ''ST'' in location 5.
* (C) If ''SUBR'' is later linked with other code it may be stored at a location other than 1. In this example the linker places it at location 120. The address in the jump instruction, which is now at location 133, must be relocated to point to the new location of the code for statement ''ST'', now 125.
61 shown in the instruction is the MIX machine code representation of 125
* (D) When the program is loaded into memory to run it may be loaded at some location other than the one assigned by the linker. This example shows ''SUBR'' now at location 300. The address in the jump instruction, now at 313, needs to be relocated again so that it points to the updated location of ''ST'', 305.
49 is the MIX machine representation of 305
Alternatives
Some architectures avoid relocation entirely by deferring address assignment to run time; as, for example, in stack machines with
zero address arithmetic or in some segmented architectures where every compilation unit is loaded into a separate segment.
See also
*
Linker (computing)
A linker or link editor is a computer program that combines intermediate software build files such as object file, object and library (computing), library files into a single executable file such as a program or library. A linker is often part o ...
*
Library (computing)
In computing, a library is a collection of System resource, resources that can be leveraged during software development to implement a computer program. Commonly, a library consists of executable code such as compiled function (computer scienc ...
*
Object file
An object file is a file that contains machine code or bytecode, as well as other data and metadata, generated by a compiler or assembler from source code during the compilation or assembly process. The machine code that is generated is kno ...
*
Prebinding
*
Static library
A static library or statically linked library contains functions and data that can be included in a consuming computer program at build-time such that the library does not need to be accessible in a separate file at run-time. If all libraries a ...
*
Self-relocation
*
Rebasing
*
Garbage collection
Waste collection is a part of the process of waste management. It is the transfer of solid waste from the point of use and disposal to the point of treatment or landfill. Waste collection also includes the curbside collection of recyclable ...
*
Pointer swizzling
In computer science, pointer swizzling is the conversion of references based on name or position into direct pointer references (memory addresses). It is typically performed during deserialization or loading of a relocatable object from a disk ...
, a lazy form of pointer modification
*
Relocatable Object Module Format
References
Further reading
*
* (3 pages) (NB. Describes a
relocatable hex format by
Mostek
Mostek Corporation was a semiconductor integrated circuit manufacturer, founded in 1969 by L. J. Sevin, Louay E. Sharif, Richard L. Petritz and other ex-employees of Texas Instruments. At its peak in the late 1970s, Mostek held an 85% market sh ...
.)
* (8 pages) (NB. Describes a
relocatable hex format by
TDL.)
*
https://web.archive.org/web/20170819173516/http://archive.computerhistory.org/resources/access/text/2016/12/102762506-05-01-acc.pd
Originally presented at: (609 pages). (This "resize" method, named ''page boundary relocation'', could be applied statically to a
CP/M-80 disk image using in order to maximize the
TPA for programs to run. It was also utilized dynamically by the CP/M debugger
Dynamic Debugging Tool (DDT) to
relocate itself into higher memory. The same approach was independently developed by
Bruce H. Van Natta of
IMS Associates to produce relocatable
PL/M code. As ''paragraph boundary relocation'',
another variant of this method was later utilized by dynamically
HMA self-relocating
TSRs like
KEYB,
SHARE, and
NLSFUNC under
DR DOS 6.0 and higher. A much more sophisticated and
byte-level granular method based on a somewhat similar approach was independently conceived and implemented by Matthias R. Paul and Axel C. Frinke for their
dynamic dead-code elimination
In compiler theory, dead-code elimination (DCE, dead-code removal, dead-code stripping, or dead-code strip) is a compiler optimization to remove dead code (code that does not affect the program results). Removing such code has several benefits: i ...
to dynamically minimize the runtime footprint of resident drivers and TSRs (like FreeKEYB).)
*
https://archive.org/details/v1n5_20230524/page/54/mode/1up] (2 pages) (NB. Describes page boundary relocation and relocating assemblers.)
*
https://www.youtube.com/watch?v=HO6IPpL0y8g] (33 pages)
*
*
*
*
*
* (2+xiv+270+6 pages)
*
*
*
*
*
*
https://archive.org/download/80-microcomputing-magazine-1983-04/80Microcomputing_0483_text.pdf]
*
https://archive.org/download/80-microcomputing-magazine-1985-04/80Microcomputing_0485_text.pdf]
*
https://archive.org/download/the-computer-journal-32/tcj_32_May-June_1988_text.pdf]
*
https://archive.org/download/the-computer-journal-33/tcj_33_July-August_1988_text.pdf]
*
https://archive.org/download/the-computer-journal-34/tcj_34_September-October_1988_text.pd
*
https://archive.org/download/the-computer-journal-54/tcj_54_January-February_1992_text.pd
*
https://archive.org/download/the-computer-journal-55/tcj_55_March-June_1992_text.pdf]
*
{{Executables
Computer libraries
Assignment operations