| Preface | p. xi |
| Linking and Loading | p. 1 |
| What Do Linkers and Loaders Do? | p. 1 |
| Address Binding: A Historical Perspective | p. 1 |
| Linking vs. Loading | p. 5 |
| Compiler Drivers | p. 10 |
| Linking: A True-Life Example | p. 12 |
| Exercises | p. 17 |
| Architectural Issues | p. 19 |
| Application Binary Interfaces | p. 20 |
| Memory Addresses | p. 20 |
| Address Formation | p. 22 |
| Instruction Formats | p. 23 |
| Procedure Calls and Addressability | p. 24 |
| Data and Instruction References | p. 28 |
| Paging and Virtual Memory | p. 34 |
| Intel 386 Segmentation | p. 41 |
| Embedded Architectures | p. 43 |
| Exercises | p. 45 |
| Object Files | p. 47 |
| What Goes into an Object File? | p. 47 |
| The Null Object Format: DOS COM Files | p. 49 |
| Code Sections: UNIX a.out Files | p. 50 |
| Relocation: DOS EXE Files | p. 56 |
| Symbols and Relocation | p. 58 |
| Relocatable a.out | p. 58 |
| UNIX ELF | p. 62 |
| IBM 360 Object Format | p. 71 |
| Microsoft Portable Executable Format | p. 75 |
| Intel/Microsoft OMF Files | p. 84 |
| Comparison of Object Formats | p. 90 |
| Exercises | p. 90 |
| Project | p. 90 |
| Storage Allocation | p. 93 |
| Segments and Addresses | p. 93 |
| Simple Storage Layout | p. 94 |
| Multiple-Segment Types | p. 96 |
| Segment and Page Alignment | p. 96 |
| Common Blocks and Other Special Segments | p. 98 |
| Linker Control Scripts | p. 107 |
| Storage Allocation in Practice | p. 108 |
| Exercises | p. 114 |
| Project | p. 115 |
| Symbol Management | p. 117 |
| Binding and Name Resolution | p. 117 |
| Symbol Table Formats | p. 118 |
| Name Mangling | p. 124 |
| Weak External and Other Kinds of Symbols | p. 129 |
| Maintaining Debugging Information | p. 129 |
| Exercises | p. 132 |
| Project | p. 133 |
| Libraries | p. 135 |
| Purpose of Libraries | p. 135 |
| Library Formats | p. 136 |
| Creating Libraries | p. 141 |
| Searching Libraries | p. 142 |
| Performance Issues | p. 144 |
| Weak External Symbols | p. 144 |
| Exercises | p. 145 |
| Project | p. 146 |
| Relocation | p. 149 |
| Hardware and Software Relocation | p. 150 |
| Link-Time and Load-Time Relocation | p. 151 |
| Symbol and Segment Relocation | p. 151 |
| Basic Relocation Techniques | p. 153 |
| Relinkable and Relocatable Output Formats | p. 159 |
| Other Relocation Formats | p. 160 |
| Relocation Special Cases | p. 162 |
| Exercises | p. 163 |
| Project | p. 164 |
| Loading and Overlays | p. 167 |
| Basic Loading | p. 167 |
| Basic Loading, with Relocation | p. 168 |
| Position-Independent Code | p. 169 |
| Bootstrap Loading | p. 176 |
| Tree-Structured Overlays | p. 177 |
| Exercises | p. 184 |
| Project | p. 185 |
| Shared Libraries | p. 187 |
| Binding Time | p. 188 |
| Shared Libraries in Practice | p. 190 |
| Address Space Management | p. 190 |
| Structure of Shared Libraries | p. 192 |
| Creating Shared Libraries | p. 192 |
| Linking with Shared Libraries | p. 197 |
| Running with Shared Libraries | p. 197 |
| The malloc Hack and Other Shared-Library Problems | p. 199 |
| Exercises | p. 202 |
| Project | p. 203 |
| Dynamic Linking and Loading | p. 205 |
| ELF Dynamic Linking | p. 206 |
| Contents of an ELF File | p. 206 |
| Loading a Dynamically Linked Program | p. 210 |
| Lazy Procedure Linkage with the PLT | p. 213 |
| Other Peculiarities of Dynamic Linking | p. 215 |
| Dynamic Loading at Run Time | p. 216 |
| Microsoft Dynamic-Link Libraries | p. 217 |
| OSF/1 Pseudo-Static Shared Libraries | p. 222 |
| Making Shared Libraries Fast | p. 223 |
| Comparison of Dynamic Linking Approaches | p. 224 |
| Exercises | p. 226 |
| Project | p. 226 |
| Advanced Techniques | p. 229 |
| Techniques for C++ | p. 229 |
| Incremental Linking and Relinking | p. 233 |
| Link-Time Garbage Collection | p. 235 |
| Link-Time Optimization | p. 237 |
| Link-Time Code Generation | p. 238 |
| The Java Linking Model | p. 241 |
| Exercises | p. 244 |
| Project | p. 245 |
| References | p. 246 |
| Index | p. 249 |
| Table of Contents provided by Syndetics. All Rights Reserved. |