173 lines
		
	
	
	
		
			7.9 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
		
		
			
		
	
	
			173 lines
		
	
	
	
		
			7.9 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
| 
								 | 
							
								<html lang="en">
							 | 
						||
| 
								 | 
							
								<head>
							 | 
						||
| 
								 | 
							
								<title>PHDRS - Untitled</title>
							 | 
						||
| 
								 | 
							
								<meta http-equiv="Content-Type" content="text/html">
							 | 
						||
| 
								 | 
							
								<meta name="description" content="Untitled">
							 | 
						||
| 
								 | 
							
								<meta name="generator" content="makeinfo 4.7">
							 | 
						||
| 
								 | 
							
								<link title="Top" rel="start" href="index.html#Top">
							 | 
						||
| 
								 | 
							
								<link rel="up" href="Scripts.html#Scripts" title="Scripts">
							 | 
						||
| 
								 | 
							
								<link rel="prev" href="MEMORY.html#MEMORY" title="MEMORY">
							 | 
						||
| 
								 | 
							
								<link rel="next" href="VERSION.html#VERSION" title="VERSION">
							 | 
						||
| 
								 | 
							
								<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
							 | 
						||
| 
								 | 
							
								<!--
							 | 
						||
| 
								 | 
							
								This file documents the GNU linker LD
							 | 
						||
| 
								 | 
							
								(GNU Binutils)
							 | 
						||
| 
								 | 
							
								version 2.19.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Copyright (C) 1991, 92, 93, 94, 95, 96, 97, 98, 99, 2000,
							 | 
						||
| 
								 | 
							
								2001, 2002, 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Permission is granted to copy, distribute and/or modify this document
							 | 
						||
| 
								 | 
							
								under the terms of the GNU Free Documentation License, Version 1.1
							 | 
						||
| 
								 | 
							
								or any later version published by the Free Software Foundation;
							 | 
						||
| 
								 | 
							
								with no Invariant Sections, with no Front-Cover Texts, and with no
							 | 
						||
| 
								 | 
							
								Back-Cover Texts.  A copy of the license is included in the
							 | 
						||
| 
								 | 
							
								section entitled ``GNU Free Documentation License''.-->
							 | 
						||
| 
								 | 
							
								<meta http-equiv="Content-Style-Type" content="text/css">
							 | 
						||
| 
								 | 
							
								<style type="text/css"><!--
							 | 
						||
| 
								 | 
							
								  pre.display { font-family:inherit }
							 | 
						||
| 
								 | 
							
								  pre.format  { font-family:inherit }
							 | 
						||
| 
								 | 
							
								  pre.smalldisplay { font-family:inherit; font-size:smaller }
							 | 
						||
| 
								 | 
							
								  pre.smallformat  { font-family:inherit; font-size:smaller }
							 | 
						||
| 
								 | 
							
								  pre.smallexample { font-size:smaller }
							 | 
						||
| 
								 | 
							
								  pre.smalllisp    { font-size:smaller }
							 | 
						||
| 
								 | 
							
								  span.sc { font-variant:small-caps }
							 | 
						||
| 
								 | 
							
								  span.roman { font-family: serif; font-weight: normal; } 
							 | 
						||
| 
								 | 
							
								--></style>
							 | 
						||
| 
								 | 
							
								</head>
							 | 
						||
| 
								 | 
							
								<body>
							 | 
						||
| 
								 | 
							
								<div class="node">
							 | 
						||
| 
								 | 
							
								<p>
							 | 
						||
| 
								 | 
							
								<a name="PHDRS"></a>Next: <a rel="next" accesskey="n" href="VERSION.html#VERSION">VERSION</a>,
							 | 
						||
| 
								 | 
							
								Previous: <a rel="previous" accesskey="p" href="MEMORY.html#MEMORY">MEMORY</a>,
							 | 
						||
| 
								 | 
							
								Up: <a rel="up" accesskey="u" href="Scripts.html#Scripts">Scripts</a>
							 | 
						||
| 
								 | 
							
								<hr><br>
							 | 
						||
| 
								 | 
							
								</div>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								<h3 class="section">3.8 PHDRS Command</h3>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								<p><a name="index-PHDRS-443"></a><a name="index-program-headers-444"></a><a name="index-ELF-program-headers-445"></a><a name="index-program-segments-446"></a><a name="index-segments_002c-ELF-447"></a>The ELF object file format uses <dfn>program headers</dfn>, also knows as
							 | 
						||
| 
								 | 
							
								<dfn>segments</dfn>.  The program headers describe how the program should be
							 | 
						||
| 
								 | 
							
								loaded into memory.  You can print them out by using the <code>objdump</code>
							 | 
						||
| 
								 | 
							
								program with the <span class="samp">-p</span> option.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   <p>When you run an ELF program on a native ELF system, the system loader
							 | 
						||
| 
								 | 
							
								reads the program headers in order to figure out how to load the
							 | 
						||
| 
								 | 
							
								program.  This will only work if the program headers are set correctly. 
							 | 
						||
| 
								 | 
							
								This manual does not describe the details of how the system loader
							 | 
						||
| 
								 | 
							
								interprets program headers; for more information, see the ELF ABI.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   <p>The linker will create reasonable program headers by default.  However,
							 | 
						||
| 
								 | 
							
								in some cases, you may need to specify the program headers more
							 | 
						||
| 
								 | 
							
								precisely.  You may use the <code>PHDRS</code> command for this purpose.  When
							 | 
						||
| 
								 | 
							
								the linker sees the <code>PHDRS</code> command in the linker script, it will
							 | 
						||
| 
								 | 
							
								not create any program headers other than the ones specified.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   <p>The linker only pays attention to the <code>PHDRS</code> command when
							 | 
						||
| 
								 | 
							
								generating an ELF output file.  In other cases, the linker will simply
							 | 
						||
| 
								 | 
							
								ignore <code>PHDRS</code>.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   <p>This is the syntax of the <code>PHDRS</code> command.  The words <code>PHDRS</code>,
							 | 
						||
| 
								 | 
							
								<code>FILEHDR</code>, <code>AT</code>, and <code>FLAGS</code> are keywords.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								<pre class="smallexample">     PHDRS
							 | 
						||
| 
								 | 
							
								     {
							 | 
						||
| 
								 | 
							
								       <var>name</var> <var>type</var> [ FILEHDR ] [ PHDRS ] [ AT ( <var>address</var> ) ]
							 | 
						||
| 
								 | 
							
								             [ FLAGS ( <var>flags</var> ) ] ;
							 | 
						||
| 
								 | 
							
								     }
							 | 
						||
| 
								 | 
							
								</pre>
							 | 
						||
| 
								 | 
							
								   <p>The <var>name</var> is used only for reference in the <code>SECTIONS</code> command
							 | 
						||
| 
								 | 
							
								of the linker script.  It is not put into the output file.  Program
							 | 
						||
| 
								 | 
							
								header names are stored in a separate name space, and will not conflict
							 | 
						||
| 
								 | 
							
								with symbol names, file names, or section names.  Each program header
							 | 
						||
| 
								 | 
							
								must have a distinct name.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   <p>Certain program header types describe segments of memory which the
							 | 
						||
| 
								 | 
							
								system loader will load from the file.  In the linker script, you
							 | 
						||
| 
								 | 
							
								specify the contents of these segments by placing allocatable output
							 | 
						||
| 
								 | 
							
								sections in the segments.  You use the <span class="samp">:</span><var>phdr</var> output section
							 | 
						||
| 
								 | 
							
								attribute to place a section in a particular segment.  See <a href="Output-Section-Phdr.html#Output-Section-Phdr">Output Section Phdr</a>.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   <p>It is normal to put certain sections in more than one segment.  This
							 | 
						||
| 
								 | 
							
								merely implies that one segment of memory contains another.  You may
							 | 
						||
| 
								 | 
							
								repeat <span class="samp">:</span><var>phdr</var>, using it once for each segment which should
							 | 
						||
| 
								 | 
							
								contain the section.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   <p>If you place a section in one or more segments using <span class="samp">:</span><var>phdr</var>,
							 | 
						||
| 
								 | 
							
								then the linker will place all subsequent allocatable sections which do
							 | 
						||
| 
								 | 
							
								not specify <span class="samp">:</span><var>phdr</var> in the same segments.  This is for
							 | 
						||
| 
								 | 
							
								convenience, since generally a whole set of contiguous sections will be
							 | 
						||
| 
								 | 
							
								placed in a single segment.  You can use <code>:NONE</code> to override the
							 | 
						||
| 
								 | 
							
								default segment and tell the linker to not put the section in any
							 | 
						||
| 
								 | 
							
								segment at all.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   <p><a name="index-FILEHDR-448"></a><a name="index-PHDRS-449"></a>You may use the <code>FILEHDR</code> and <code>PHDRS</code> keywords appear after
							 | 
						||
| 
								 | 
							
								the program header type to further describe the contents of the segment. 
							 | 
						||
| 
								 | 
							
								The <code>FILEHDR</code> keyword means that the segment should include the ELF
							 | 
						||
| 
								 | 
							
								file header.  The <code>PHDRS</code> keyword means that the segment should
							 | 
						||
| 
								 | 
							
								include the ELF program headers themselves.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   <p>The <var>type</var> may be one of the following.  The numbers indicate the
							 | 
						||
| 
								 | 
							
								value of the keyword.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								     <dl>
							 | 
						||
| 
								 | 
							
								<dt><code>PT_NULL</code> (0)<dd>Indicates an unused program header.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								     <br><dt><code>PT_LOAD</code> (1)<dd>Indicates that this program header describes a segment to be loaded from
							 | 
						||
| 
								 | 
							
								the file.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								     <br><dt><code>PT_DYNAMIC</code> (2)<dd>Indicates a segment where dynamic linking information can be found.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								     <br><dt><code>PT_INTERP</code> (3)<dd>Indicates a segment where the name of the program interpreter may be
							 | 
						||
| 
								 | 
							
								found.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								     <br><dt><code>PT_NOTE</code> (4)<dd>Indicates a segment holding note information.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								     <br><dt><code>PT_SHLIB</code> (5)<dd>A reserved program header type, defined but not specified by the ELF
							 | 
						||
| 
								 | 
							
								ABI.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								     <br><dt><code>PT_PHDR</code> (6)<dd>Indicates a segment where the program headers may be found.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								     <br><dt><var>expression</var><dd>An expression giving the numeric type of the program header.  This may
							 | 
						||
| 
								 | 
							
								be used for types not defined above. 
							 | 
						||
| 
								 | 
							
								</dl>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   <p>You can specify that a segment should be loaded at a particular address
							 | 
						||
| 
								 | 
							
								in memory by using an <code>AT</code> expression.  This is identical to the
							 | 
						||
| 
								 | 
							
								<code>AT</code> command used as an output section attribute (see <a href="Output-Section-LMA.html#Output-Section-LMA">Output Section LMA</a>).  The <code>AT</code> command for a program header overrides the
							 | 
						||
| 
								 | 
							
								output section attribute.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   <p>The linker will normally set the segment flags based on the sections
							 | 
						||
| 
								 | 
							
								which comprise the segment.  You may use the <code>FLAGS</code> keyword to
							 | 
						||
| 
								 | 
							
								explicitly specify the segment flags.  The value of <var>flags</var> must be
							 | 
						||
| 
								 | 
							
								an integer.  It is used to set the <code>p_flags</code> field of the program
							 | 
						||
| 
								 | 
							
								header.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   <p>Here is an example of <code>PHDRS</code>.  This shows a typical set of program
							 | 
						||
| 
								 | 
							
								headers used on a native ELF system.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								<pre class="example">     PHDRS
							 | 
						||
| 
								 | 
							
								     {
							 | 
						||
| 
								 | 
							
								       headers PT_PHDR PHDRS ;
							 | 
						||
| 
								 | 
							
								       interp PT_INTERP ;
							 | 
						||
| 
								 | 
							
								       text PT_LOAD FILEHDR PHDRS ;
							 | 
						||
| 
								 | 
							
								       data PT_LOAD ;
							 | 
						||
| 
								 | 
							
								       dynamic PT_DYNAMIC ;
							 | 
						||
| 
								 | 
							
								     }
							 | 
						||
| 
								 | 
							
								     
							 | 
						||
| 
								 | 
							
								     SECTIONS
							 | 
						||
| 
								 | 
							
								     {
							 | 
						||
| 
								 | 
							
								       . = SIZEOF_HEADERS;
							 | 
						||
| 
								 | 
							
								       .interp : { *(.interp) } :text :interp
							 | 
						||
| 
								 | 
							
								       .text : { *(.text) } :text
							 | 
						||
| 
								 | 
							
								       .rodata : { *(.rodata) } /* defaults to :text */
							 | 
						||
| 
								 | 
							
								       ...
							 | 
						||
| 
								 | 
							
								       . = . + 0x1000; /* move to a new page in memory */
							 | 
						||
| 
								 | 
							
								       .data : { *(.data) } :data
							 | 
						||
| 
								 | 
							
								       .dynamic : { *(.dynamic) } :data :dynamic
							 | 
						||
| 
								 | 
							
								       ...
							 | 
						||
| 
								 | 
							
								     }
							 | 
						||
| 
								 | 
							
								</pre>
							 | 
						||
| 
								 | 
							
								   </body></html>
							 | 
						||
| 
								 | 
							
								
							 |