X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?p=pintos-anon;a=blobdiff_plain;f=specs%2Fsysv-abi-update.html%2Fch5.dynamic.html;fp=specs%2Fsysv-abi-update.html%2Fch5.dynamic.html;h=da7bfb6bc4d3c11c47a33957cee30c67461411eb;hp=0000000000000000000000000000000000000000;hb=8af06d1fd50343e17229618ef4d2693193b2b3d9;hpb=d0d14ca50fbac167253e1e1d8d806bfd749a5e8a diff --git a/specs/sysv-abi-update.html/ch5.dynamic.html b/specs/sysv-abi-update.html/ch5.dynamic.html new file mode 100644 index 0000000..da7bfb6 --- /dev/null +++ b/specs/sysv-abi-update.html/ch5.dynamic.html @@ -0,0 +1,1250 @@ + +Dynamic Linking

+

Dynamic Linking

+ +

Program Interpreter

+An executable file that participates in +dynamic linking shall have one +PT_INTERP program header element. +During +exec(BA_OS), +the system retrieves a path name from the PT_INTERP +segment and creates the initial process image from +the interpreter file's segments. That is, +instead of using the original executable file's +segment images, the system composes a memory +image for the interpreter. +It then is the interpreter's responsibility to +receive control from the system and provide an +environment for the application program. +

+As ``Process Initialization'' in Chapter 3 of the +processor supplement mentions, +the interpreter receives control in one of two ways. +First, it may receive a file descriptor +to read the executable file, positioned at the beginning. +It can use this file descriptor to read and/or map the executable +file's segments into memory. +Second, depending on the executable file format, the system +may load the executable file into memory instead of giving the +interpreter an open file descriptor. +With the possible exception of the file descriptor, +the interpreter's initial process state matches +what the executable file would have received. +The interpreter itself may not require a second interpreter. +An interpreter may be either a shared object +or an executable file. +

+ +

Dynamic Linker

+When building an executable file that uses dynamic linking, +the link editor adds a program header element of type +PT_INTERP to an executable file, telling the system to invoke +the dynamic linker as the program interpreter. +
+NOTE: +The locations of the system provided dynamic +linkers are processor specific. +

+Exec(BA_OS) +and the dynamic linker cooperate to +create the process image for the program, which entails +the following actions: +

+

+The link editor also constructs various data +that assist the dynamic linker +for executable and shared object files. +As shown above in +``Program Header'', +this data resides +in loadable segments, making them available during execution. +(Once again, recall the exact segment contents are processor-specific. +See the processor supplement for complete information). +

+

+Because every ABI-conforming program imports the basic system +services from a shared object library [See ``System Library'' +in Chapter 6], the dynamic linker participates in every +ABI-conforming program execution. +

+As +`Program Loading'' explains in the processor supplement, +shared objects may occupy +virtual memory addresses that are different from the addresses recorded +in the file's program header table. +The dynamic linker relocates the memory image, updating +absolute addresses before the application gains control. +Although the absolute address values would be correct +if the library were loaded at +the addresses specified in the program header table, this normally +is not the case. +

+If the process environment [see exec(BA_OS)] +contains a variable named LD_BIND_NOW +with a non-null value, the dynamic linker processes +all relocations before transferring control to the program. +For example, all the following environment entries +would specify this behavior. +

+Otherwise, LD_BIND_NOW either +does not occur in the environment or has a null value. +The dynamic linker is permitted to evaluate procedure linkage table +entries lazily, thus avoiding symbol resolution and relocation +overhead for functions that are not called. +See ``Procedure Linkage Table'' in this chapter of the processor +supplement for more information. + +

Dynamic Section

+If an object file participates in dynamic linking, +its program header table will have an element of type +PT_DYNAMIC. +This ``segment'' contains the .dynamic section. +A special symbol, _DYNAMIC, +labels the section, which contains +an array of the following structures. +


+Figure 5-9: Dynamic Structure +

+

+
+typedef struct {
+	Elf32_Sword	d_tag;
+   	union {
+   		Elf32_Word	d_val;
+   		Elf32_Addr	d_ptr;
+	} d_un;
+} Elf32_Dyn;
+
+extern Elf32_Dyn	_DYNAMIC[];
+
+typedef struct {
+	Elf64_Sxword	d_tag;
+   	union {
+   		Elf64_Xword	d_val;
+   		Elf64_Addr	d_ptr;
+	} d_un;
+} Elf64_Dyn;
+
+extern Elf64_Dyn	_DYNAMIC[];
+
+
+
+

+For each object with this type, d_tag +controls the interpretation of d_un. +

+

d_val
+These objects represent integer values with various +interpretations. +

d_ptr
+These objects represent program virtual addresses. +As mentioned previously, a file's virtual addresses +might not match the memory virtual addresses during execution. +When interpreting addresses contained in the dynamic +structure, the dynamic linker computes actual addresses, +based on the original file value and the memory base address. +For consistency, files do not +contain relocation entries to ``correct'' addresses in the dynamic +structure. +
+

+ +To make it simpler for tools to interpret the contents of +dynamic section entries, the value of each tag, except for those in +two special compatibility ranges, +will determine the interpretation of the d_un +union. A tag whose value is an even number +indicates a dynamic section entry that uses d_ptr. +A tag whose value is an odd number indicates a dynamic section entry +that uses d_val or that uses neither d_ptr +nor d_val. Tags whose values are less +than the special value DT_ENCODING and tags +whose values fall between DT_HIOS and +DT_LOPROC do not follow these rules. +

+The following table summarizes the tag requirements +for executable and shared object files. +If a tag is marked ``mandatory'', the dynamic linking +array for an ABI-conforming file must have an entry of that type. +Likewise, ``optional'' means an entry for the tag may appear +but is not required. +


+Figure 5-10: Dynamic Array Tags, d_tag +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameValued_unExecutableShared Object
DT_NULL0ignoredmandatorymandatory
DT_NEEDED1d_valoptionaloptional
DT_PLTRELSZ2d_valoptionaloptional
DT_PLTGOT3d_ptroptionaloptional
DT_HASH4d_ptrmandatorymandatory
DT_STRTAB5d_ptrmandatorymandatory
DT_SYMTAB6d_ptrmandatorymandatory
DT_RELA7d_ptrmandatoryoptional
DT_RELASZ8d_valmandatoryoptional
DT_RELAENT9d_valmandatoryoptional
DT_STRSZ10d_valmandatorymandatory
DT_SYMENT11d_valmandatorymandatory
DT_INIT12d_ptroptionaloptional
DT_FINI13d_ptroptionaloptional
DT_SONAME14d_valignoredoptional
DT_RPATH*15d_valoptionalignored
DT_SYMBOLIC*16ignoredignoredoptional
DT_REL17d_ptrmandatoryoptional
DT_RELSZ18d_valmandatoryoptional
DT_RELENT19d_valmandatoryoptional
DT_PLTREL20d_valoptionaloptional
DT_DEBUG21d_ptroptionalignored
DT_TEXTREL*22ignoredoptionaloptional
DT_JMPREL23d_ptroptionaloptional
DT_BIND_NOW*24ignoredoptionaloptional
DT_INIT_ARRAY25d_ptroptionaloptional
DT_FINI_ARRAY26d_ptroptionaloptional
DT_INIT_ARRAYSZ27d_valoptionaloptional
DT_FINI_ARRAYSZ28d_valoptionaloptional
DT_RUNPATH29d_valoptionaloptional
DT_FLAGS30d_valoptionaloptional
DT_ENCODING32unspecifiedunspecifiedunspecified
DT_PREINIT_ARRAY32d_ptroptionalignored
DT_PREINIT_ARRAYSZ33d_valoptionalignored
DT_LOOS0x6000000Dunspecifiedunspecifiedunspecified
DT_HIOS0x6ffff000unspecifiedunspecifiedunspecified
DT_LOPROC0x70000000unspecifiedunspecifiedunspecified
DT_HIPROC0x7fffffffunspecifiedunspecifiedunspecified
+

+* Signifies an entry that is at level 2. +


+
+

DT_NULL
+An entry with a DT_NULL tag marks the end of the +_DYNAMIC array. +

DT_NEEDED
+This element holds the string table offset of a null-terminated string, +giving the name of a needed library. +The offset is an index into the table recorded in the DT_STRTAB code. +See +``Shared Object Dependencies'' +for more +information about these names. +The dynamic array may contain multiple entries with +this type. +These entries' relative order is significant, though their +relation to entries of other types is not. +

DT_PLTRELSZ
+This element holds the total size, in bytes, +of the relocation entries associated with the procedure linkage table. +If an entry of type DT_JMPREL is present, a +DT_PLTRELSZ must accompany it. +

DT_PLTGOT
+This element holds an address associated with the procedure linkage table +and/or the global offset table. +See this section in the processor supplement for details. +

DT_HASH
+This element holds the address of the symbol hash table, +described in +``Hash Table''. +This hash table refers to the symbol table referenced by the DT_SYMTAB +element. +

DT_STRTAB
+This element holds the address of the string table, +described in Chapter 4. +Symbol names, library names, and other strings reside +in this table. +

DT_SYMTAB
+This element holds the address of the symbol table, +described in the first part of this chapter, with Elf32_Sym +entries for the 32-bit class of files and Elf64_Sym +entries for the 64-bit class of files. +

DT_RELA
+This element holds the address of a relocation table, +described in Chapter 4. +Entries in the table have explicit addends, such as +Elf32_Rela for the 32-bit file class +or Elf64_Rela for the 64-bit file class. +An object file may have multiple relocation sections. +When building the relocation table for an +executable or shared object file, the link editor +catenates those sections to form a single table. +Although the sections remain independent in the object file, +the dynamic linker sees a single table. +When the dynamic linker creates the process image for +an executable file or adds a shared object to the +process image, it reads the relocation table and performs +the associated actions. +If this element is present, the dynamic structure must also have +DT_RELASZ and DT_RELAENT elements. +When relocation is ``mandatory'' for a file, either +DT_RELA or DT_REL may occur (both are permitted but not required). +

DT_RELASZ
+This element holds the total size, in bytes, of the +DT_RELA relocation table. +

DT_RELAENT
+This element holds the size, in bytes, of the +DT_RELA relocation entry. +

DT_STRSZ
+This element holds the size, in bytes, of the string table. +

DT_SYMENT
+This element holds the size, in bytes, of a symbol table entry. +

DT_INIT
+This element holds the address of the initialization function, +discussed in +``Initialization and Termination Functions'' +below. +

DT_FINI
+This element holds the address of the termination function, +discussed in +``Initialization and Termination Functions'' +below. +

DT_SONAME
+This element holds the string table offset of a null-terminated string, +giving the name of the shared object. +The offset is an index into the table recorded in the DT_STRTAB entry. +See +``Shared Object Dependencies'' +below for more +information about these names. + +

DT_RPATH
+This element holds the string table offset of a null-terminated search +library search path string discussed in +``Shared Object Dependencies''. +The offset is an index into the table recorded in the +DT_STRTAB entry. This entry is at level 2. Its +use has been superseded by DT_RUNPATH. +

DT_SYMBOLIC
+This element's presence in a shared object library alters +the dynamic linker's symbol resolution algorithm for +references within the library. +Instead of starting a symbol search with the +executable file, the dynamic linker starts from the +shared object itself. +If the shared object fails to supply the referenced +symbol, the dynamic linker then searches the +executable file and other shared objects as usual. +This entry is at level 2. Its use has been superseded +by the DF_SYMBOLIC flag. +

DT_REL
+This element is similar to DT_RELA, +except its table has implicit addends, such as +Elf32_Rel for the 32-bit file class +or Elf64_Rel for the 64-bit file class. +If this element is present, the dynamic structure must also have +DT_RELSZ and DT_RELENT elements. +

DT_RELSZ
+This element holds the total size, in bytes, of the +DT_REL relocation table. +

DT_RELENT
+This element holds the size, in bytes, of the +DT_REL relocation entry. +

DT_PLTREL
+This member specifies the type of relocation entry +to which the procedure linkage table refers. +The d_val member holds DT_REL or DT_RELA, +as appropriate. +All relocations in a procedure linkage table must use +the same relocation. +

DT_DEBUG
+This member is used for debugging. Its contents are not specified +for the ABI; programs that access this entry are not +ABI-conforming. +

DT_TEXTREL
+This member's absence signifies that no +relocation entry should cause a modification to a non-writable +segment, as specified by the segment permissions in the program +header table. +If this member is present, one or more relocation entries might +request modifications to a non-writable segment, and the dynamic +linker can prepare accordingly. +This entry is at level 2. Its use has been superseded +by the DF_TEXTREL flag. +

DT_JMPREL
+If present, this entry's d_ptr +member holds the address of relocation entries associated solely +with the procedure linkage table. +Separating these relocation entries lets the dynamic linker ignore +them during process initialization, if lazy binding is enabled. +If this entry is present, the related entries of types +DT_PLTRELSZ and DT_PLTREL +must also be present. +

DT_BIND_NOW
+If present in a shared object or executable, this entry +instructs the dynamic linker to process all relocations +for the object containing this entry before transferring +control to the program. +The presence of this entry takes +precedence over a directive to use lazy binding for this object when +specified through the environment or via dlopen(BA_LIB). +This entry is at level 2. Its use has been superseded +by the DF_BIND_NOW flag. +

DT_INIT_ARRAY
+ +This element holds the address of the array of pointers to initialization +functions, +discussed in +``Initialization and Termination Functions'' +below. +

DT_FINI_ARRAY
+This element holds the address of the array of pointers to termination +functions, +discussed in +``Initialization and Termination Functions'' +below. +

DT_INIT_ARRAYSZ
+This element holds the size in bytes of the array of initialization +functions pointed to by the DT_INIT_ARRAY entry. +If an object has a DT_INIT_ARRAY entry, it must +also have a DT_INIT_ARRAYSZ entry. +

DT_FINI_ARRAYSZ
+This element holds the size in bytes of the array of termination +functions pointed to by the DT_FINI_ARRAY entry. +If an object has a DT_FINI_ARRAY entry, it must +also have a DT_FINI_ARRAYSZ entry. + +

DT_RUNPATH
+This element holds the string table offset of a null-terminated +library search path string discussed in +``Shared Object Dependencies''. +The offset is an index into the table recorded in the +DT_STRTAB entry. +

DT_FLAGS
+This element holds flag values specific to the object being +loaded. Each flag value will have the name DF_flag_name. +Defined values and their meanings are described below. +All other values are reserved. +

DT_PREINIT_ARRAY
+This element holds the address of the array of pointers to pre-initialization +functions, +discussed in +``Initialization and Termination Functions'' +below. The DT_PREINIT_ARRAY table is processed only +in an executable file; it is ignored if contained in a shared object. +

DT_PREINIT_ARRAYSZ
+This element holds the size in bytes of the array of pre-initialization +functions pointed to by the DT_PREINIT_ARRAY entry. +If an object has a DT_PREINIT_ARRAY entry, it must +also have a DT_PREINIT_ARRAYSZ entry. As with +DT_PREINIT_ARRAY, this entry is ignored if it appears +in a shared object. +

DT_ENCODING
+Values greater than or equal to DT_ENCODING +and less than DT_LOOS +follow the rules for the interpretation of the d_un union +described above. +

DT_LOOS through DT_HIOS
+Values in this inclusive range +are reserved for operating system-specific semantics. +All such values follow the rules for the interpretation of the +d_un union described above. +

DT_LOPROC through DT_HIPROC
+Values in this inclusive range +are reserved for processor-specific semantics. If meanings +are specified, the processor supplement explains them. +All such values follow the rules for the interpretation of the +d_un union described above. +
+

+Except for the DT_NULL element at the end of the array, +and the relative order of DT_NEEDED +elements, entries may appear in any order. +Tag values not appearing in the table are reserved. + +


+Figure 5-11: DT_FLAGS values +

+ + + + + + + + + + + + + + + + + + + + + + + +
NameValue
DF_ORIGIN0x1
DF_SYMBOLIC0x2
DF_TEXTREL0x4
DF_BIND_NOW0x8
DF_STATIC_TLS0x10
+


+
+

DF_ORIGIN
+This flag signifies that the object being loaded may make reference +to the $ORIGIN substitution string (see ``Substitution Sequences''). +The dynamic linker must determine the pathname of the object +containing this entry when the object is loaded. + +

DF_SYMBOLIC
+If this flag is set in a shared object library, +the dynamic linker's symbol resolution algorithm for +references within the library is changed. +Instead of starting a symbol search with the +executable file, the dynamic linker starts from the +shared object itself. +If the shared object fails to supply the referenced +symbol, the dynamic linker then searches the +executable file and other shared objects as usual. + +

DF_TEXTREL
+If this flag is not set, no +relocation entry should cause a modification to a non-writable +segment, as specified by the segment permissions in the program +header table. +If this flag is set, one or more relocation entries might +request modifications to a non-writable segment, and the dynamic +linker can prepare accordingly. + +

DF_BIND_NOW
+If set in a shared object or executable, this flag +instructs the dynamic linker to process all relocations +for the object containing this entry before transferring +control to the program. +The presence of this entry takes +precedence over a directive to use lazy binding for this object when +specified through the environment or via dlopen(BA_LIB). + +

DF_STATIC_TLS
+If set in a shared object or executable, +this flag instructs the dynamic linker to reject +attempts to load this file dynamically. +It indicates that the shared object or executable +contains code using a static thread-local storage scheme. +Implementations need not support any form of thread-local storage. +
+ +

Shared Object Dependencies

+When the link editor processes an archive library, +it extracts library members and copies them into +the output object file. +These statically linked services are available during +execution without involving the dynamic linker. +Shared objects also provide services, and +the dynamic linker must attach the proper shared object files to +the process image for execution. +

+When the dynamic linker creates the memory segments for +an object file, the dependencies (recorded in +DT_NEEDED entries of the dynamic structure) +tell what shared objects are needed to +supply the program's services. +By repeatedly connecting referenced shared objects and +their dependencies, the dynamic linker builds a complete process image. +When resolving symbolic references, the dynamic linker +examines the symbol tables with a breadth-first search. +That is, it first looks at the symbol table of the +executable program itself, then at the symbol tables +of the DT_NEEDED entries (in order), +and then at the second level DT_NEEDED entries, and +so on. Shared object files must be readable by the process; +other permissions are not required. +


+NOTE: +Even when a shared object is referenced multiple +times in the dependency list, the dynamic linker will +connect the object only once to the process. +

+

+Names in the dependency list are copies either of the +DT_SONAME strings or the path names of the shared objects used to build +the object file. +For example, if the link editor builds an executable +file using one shared object with a +DT_SONAME entry of lib1 +and another shared object library with the path name +/usr/lib/lib2, the executable file will contain +lib1 and /usr/lib/lib2 in its dependency list. +

+If a shared object name has one or more slash (/) +characters anywhere in the name, such as /usr/lib/lib2 +or directory/file, the dynamic linker uses that string directly +as the path name. +If the name has no slashes, such as lib1, +three facilities specify shared object path searching. +