8.74. .section name

Use the .section directive to assemble the following code into a section named name.

This directive is only supported for targets that actually support arbitrarily named sections; on a.out targets, for example, it is not accepted, even with a standard a.out section name.

8.74.1. COFF Version

For COFF targets, the .section directive is used in one of the following ways:

.section name[, "flags"]
.section name[, subsegment]

If the optional argument is quoted, it is taken as flags to use for the section. Each flag is a single character. The following flags are recognized:


bss section (uninitialized data)


section is not loaded


writable section


data section


read-only section


executable section


shared section (meaningful for PE targets)


ignored. (For compatibility with the ELF version)

If no flags are specified, the default flags depend upon the section name. If the section name is not recognized, the default will be for the section to be loaded and writable. Note the n and w flags remove attributes from the section, rather than adding them, so if they are used on their own it will be as if no flags had been specified at all.

If the optional argument to the .section directive is not quoted, it is taken as a subsegment number (refer to Section 5.4 Sub-Sections).

8.74.2. ELF Version

This is one of the ELF section stack manipulation directives. The others are .subsection (refer to Section 8.85 .subsection name), .pushsection (refer to Section 8.69 .pushsection name, subsection), .popsection (refer to Section 8.64 .popsection), and .previous (refer to Section 8.63 .previous).

For ELF targets, the .section directive is used like this:

.section name [, "flags"[, @type[, @entsize]]]

The optional flags argument is a quoted string which may contain any combination of the following characters:


section is allocatable


section is writable


section is executable


section is mergeable


section contains zero terminated strings

The optional type argument may contain one of the following constants:


section contains data


section does not contain data (i.e., section only occupies space)

Note on targets where the @ character is the start of a comment (eg ARM) then another character is used instead. For example the ARM port uses the % character.

If flags contains M flag, type argument must be specified as well as entsize argument. Sections with M flag but not S flag must contain fixed size constants, each entsize octets long. Sections with both M and S must contain zero terminated strings where each character is entsize bytes long. The linker may remove duplicates within sections with the same name, same entity size and same flags.

If no flags are specified, the default flags depend upon the section name. If the section name is not recognized, the default will be for the section to have none of the above flags: it will not be allocated in memory, nor writable, nor executable. The section will contain data.

For ELF targets, the assembler supports another type of .section directive for compatibility with the Solaris assembler:

.section "name"[, flags...]

Note that the section name is quoted. There may be a sequence of comma separated flags:


section is allocatable


section is writable


section is executable

This directive replaces the current section and subsection. The replaced section and subsection are pushed onto the section stack. See the contents of the gas testsuite directory gas/testsuite/gas/elf for some examples of how this directive and the other section stack directives work.