Linker Scripts; Basic Linker Script Concepts; Linker Script Format - Red Hat ENTERPRISE LINUX 3 - USING ID Using Instructions

Using ld, the gnu linker
Hide thumbs Also See for ENTERPRISE LINUX 3 - USING ID:
Table of Contents

Advertisement

Chapter 4.

Linker Scripts

Every link is controlled by a linker script. This script is written in the linker command language.
The main purpose of the linker script is to describe how the sections in the input files should be
mapped into the output file, and to control the memory layout of the output file. Most linker scripts
do nothing more than this. However, when necessary, the linker script can also direct the linker to
perform many other operations, using the commands described below.
The linker always uses a linker script. If you do not supply one yourself, the linker will use a default
script that is compiled into the linker executable. You can use the
command line option
-verbose
to display the default linker script. Certain command line options, such as
or
, will affect the
-r
-N
default linker script.
You may supply your own linker script by using the
command line option. When you do this, your
-T
linker script will replace the default linker script.
You may also use linker scripts implicitly by naming them as input files to the linker, as though they
were files to be linked. Refer to Section 4.11 Implicit Linker Scripts.

4.1. Basic Linker Script Concepts

We need to define some basic concepts and vocabulary in order to describe the linker script language.
The linker combines input files into a single output file. The output file and each input file are in a
special data format known as an object file format. Each file is called an object file. The output file
is often called an executable, but for our purposes we will also call it an object file. Each object file
has, among other things, a list of sections. We sometimes refer to a section in an input file as an input
section; similarly, a section in the output file is an output section.
Each section in an object file has a name and a size. Most sections also have an associated block
of data, known as the section contents. A section may be marked as loadable, which mean that the
contents should be loaded into memory when the output file is run. A section with no contents may be
allocatable, which means that an area in memory should be set aside, but nothing in particular should
be loaded there (in some cases this memory must be zeroed out). A section which is neither loadable
nor allocatable typically contains some sort of debugging information.
Every loadable or allocatable output section has two addresses. The first is the VMA, or virtual memory
address. This is the address the section will have when the output file is run. The second is the LMA,
or load memory address. This is the address at which the section will be loaded. In most cases the
two addresses will be the same. An example of when they might be different is when a data section
is loaded into ROM, and then copied into RAM when the program starts up (this technique is often
used to initialize global variables in a ROM based system). In this case the ROM address would be
the LMA, and the RAM address would be the VMA.
You can see the sections in an object file by using the
program with the
option.
objdump
-h
Every object file also has a list of symbols, known as the symbol table. A symbol may be defined or
undefined. Each symbol has a name, and each defined symbol has an address, among other informa-
tion. If you compile a C or C++ program into an object file, you will get a defined symbol for every
defined function and global or static variable. Every undefined function or global variable which is
referenced in the input file will become an undefined symbol.
You can see the symbols in an object file by using the
program, or by using the
program
nm
objdump
with the
option.
-t

Advertisement

Table of Contents
loading

This manual is also suitable for:

Enterprise linux 3

Table of Contents