3.6.4.1 Input Section Basics

An input section description consists of a file name optionally followed by a list of section names in parentheses.

The file name and the section name may be wildcard patterns, which we describe further below (see Input Section Wildcards ).

The most common input section description is to include all input sections with a particular name in the output section. For example, to include all input ‘ .text ’ sections, you would write:

     *(.text)

Here the ‘ * ’ is a wildcard which matches any file name. To exclude a list of files from matching the file name wildcard, EXCLUDE_FILE may be used to match all files except the ones specified in the EXCLUDE_FILE list. For example:

     EXCLUDE_FILE (*crtend.o *otherfile.o) *(.ctors)

will cause all .ctors sections from all files except crtend.o and otherfile.o to be included. The EXCLUDE_FILE can also be placed inside the section list, for example:

     *(EXCLUDE_FILE (*crtend.o *otherfile.o) .ctors)

The result of this is identically to the previous example. Supporting two syntaxes for EXCLUDE_FILE is useful if the section list contains more than one section, as described below.

There are two ways to include more than one section:

     *(.text .rdata)
     *(.text) *(.rdata)

The difference between these is the order in which the ‘ .text ’ and ‘ .rdata ’ input sections will appear in the output section. In the first example, they will be intermingled, appearing in the same order as they are found in the linker input. In the second example, all ‘ .text ’ input sections will appear first, followed by all ‘ .rdata ’ input sections.

When using EXCLUDE_FILE with more than one section, if the exclusion is within the section list then the exclusion only applies to the immediately following section, for example:

     *(EXCLUDE_FILE (*somefile.o) .text .rdata)

will cause all ‘ .text ’ sections from all files except somefile.o to be included, while all ‘ .rdata ’ sections from all files, including somefile.o , will be included. To exclude the ‘ .rdata ’ sections from somefile.o the example could be modified to:

     *(EXCLUDE_FILE (*somefile.o) .text EXCLUDE_FILE (*somefile.o) .rdata)

Alternatively, placing the EXCLUDE_FILE outside of the section list, before the input file selection, will cause the exclusion to apply for all sections. Thus the previous example can be rewritten as:

     EXCLUDE_FILE (*somefile.o) *(.text .rdata)

You can specify a file name to include sections from a particular file. You would do this if one or more of your files contain special data that needs to be at a particular location in memory. For example:

     data.o(.data)

To refine the sections that are included based on the section flags of an input section, INPUT_SECTION_FLAGS may be used.

Here is a simple example for using Section header flags for ELF sections:

     SECTIONS {
       .text : { INPUT_SECTION_FLAGS (SHF_MERGE & SHF_STRINGS) *(.text) }
       .text2 :  { INPUT_SECTION_FLAGS (!SHF_WRITE) *(.text) }
     }

In this example, the output section ‘ .text ’ will be comprised of any input section matching the name *(.text) whose section header flags SHF_MERGE and SHF_STRINGS are set. The output section ‘ .text2 ’ will be comprised of any input section matching the name *(.text) whose section header flag SHF_WRITE is clear.

You can also specify files within archives by writing a pattern matching the archive, a colon, then the pattern matching the file, with no whitespace around the colon.

archive:file
matches file within archive
archive:
matches the whole archive
:file
matches file but not one in an archive

Either one or both of ‘ archive ’ and ‘ file ’ can contain shell wildcards. On DOS based file systems, the linker will assume that a single letter followed by a colon is a drive specifier, so ‘ c:myfile.o ’ is a simple file specification, not ‘ myfile.o ’ within an archive called ‘ c ’. ‘ archive:file ’ filespecs may also be used within an EXCLUDE_FILE list, but may not appear in other linker script contexts. For instance, you cannot extract a file from an archive by using ‘ archive:file ’ in an INPUT command.

If you use a file name without a list of sections, then all sections in the input file will be included in the output section. This is not commonly done, but it may by useful on occasion. For example:

     data.o

When you use a file name which is not an ‘ archive:file ’ specifier and does not contain any wild card characters, the linker will first see if you also specified the file name on the linker command line or in an INPUT command. If you did not, the linker will attempt to open the file as an input file, as though it appeared on the command line. Note that this differs from an INPUT command, because the linker will not search for the file in the archive search path.