00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031 #if !defined(_emit_Elf_Static_h_)
00032 #define _emit_Elf_Static_h
00033
00034 #include "Symtab.h"
00035 #include "Archive.h"
00036 #include "Region.h"
00037 #include "Symbol.h"
00038 #include "LinkMap.h"
00039 #include "Object.h"
00040
00041 #include <deque>
00042 #include <map>
00043 #include <vector>
00044 #include <set>
00045 using namespace std;
00046
00047 #include "boost/tuple/tuple.hpp"
00048
00049 namespace Dyninst{
00050 namespace SymtabAPI{
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066 extern const std::string SYMTAB_CTOR_LIST_REL;
00067 extern const std::string SYMTAB_DTOR_LIST_REL;
00068 extern const std::string SYMTAB_IREL_START;
00069 extern const std::string SYMTAB_IREL_END;
00070
00071
00072
00073
00074
00075
00076
00077 class emitElfUtils {
00078 public:
00079 static Address orderLoadableSections(
00080 Symtab *obj, vector<Region*> & sections);
00081 static bool sort_reg(const Region*a, const Region*b);
00082 static bool updateHeapVariables(Symtab *obj, unsigned long loadSecsSize);
00083 static bool updateRelocation(Symtab *obj, relocationEntry &rel, int library_adjust);
00084 };
00085
00086 class emitElfStatic {
00087 public:
00088
00089 emitElfStatic(unsigned addressWidth, bool isStripped);
00090
00091 enum StaticLinkError {
00092 No_Static_Link_Error,
00093 Link_Location_Error,
00094 Symbol_Resolution_Failure,
00095 Relocation_Computation_Failure,
00096 Storage_Allocation_Failure
00097 };
00098
00099 static std::string printStaticLinkError(StaticLinkError);
00100
00101
00102 char *linkStatic(Symtab *target,
00103 StaticLinkError &err,
00104 string &errMsg);
00105
00106 bool resolveSymbols(Symtab *target,
00107 vector<Symtab *> &relocatableObjects,
00108 LinkMap &lmap,
00109 StaticLinkError &err,
00110 string &errMsg);
00111
00112 bool createLinkMap(Symtab *target,
00113 vector<Symtab *> &relocatableObjects,
00114 Offset& globalOffset,
00115 LinkMap &lmap,
00116 StaticLinkError &err,
00117 string &errMsg);
00118
00119 Offset layoutRegions(deque<Region *> ®ions,
00120 map<Region *, LinkMap::AllocPair> ®ionAllocs,
00121 Offset currentOffset,
00122 Offset globalOffset);
00123
00124 Offset allocStubRegions(LinkMap &lmap, Offset globalOffset);
00125
00126 bool addNewRegions(Symtab *target,
00127 Offset globalOffset,
00128 LinkMap &lmap);
00129
00130 void copyRegions(LinkMap &lmap);
00131
00132 bool applyRelocations(Symtab *target,
00133 vector<Symtab *> &relocatableObjects,
00134 Offset globalOffset,
00135 LinkMap &lmap,
00136 StaticLinkError &err,
00137 string &errMsg);
00138 bool buildPLT(Symtab *target,
00139 Offset globalOffset,
00140 LinkMap &lmap,
00141 StaticLinkError &err,
00142 string &errMsg);
00143
00144 bool buildRela(Symtab *target,
00145 Offset globalOffset,
00146 LinkMap &lmap,
00147 StaticLinkError &err,
00148 string &errMsg);
00149
00150 bool hasRewrittenTLS() const;
00151
00152 private:
00153
00154 Offset computePadding(Offset candidateOffset, Offset alignment);
00155
00156
00157
00158
00159
00160
00161
00162
00163
00164
00165
00166 char getPaddingValue(Region::RegionType rtype);
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177
00178
00179
00180
00181
00182
00183 bool archSpecificRelocation(Symtab *targetSymtab,
00184 Symtab *srcSymtab,
00185 char *targetData,
00186 relocationEntry &rel,
00187 Offset dest,
00188 Offset relOffset,
00189 Offset globalOffset,
00190 LinkMap &lmap,
00191 string &errMsg);
00192
00193
00194 bool handleInterModuleSpecialCase(Symtab *target,
00195 Symtab *src,
00196 LinkMap &lmap,
00197 char *data,
00198 relocationEntry rel,
00199 Offset newTOC,
00200 Offset oldTOC,
00201 Offset dest,
00202 Offset relOffset,
00203 Offset globalOffset);
00204 Offset findOrCreateStub(Symbol *sym, LinkMap &lmap, Offset newTOC, Offset oldTOC, char *data, Offset global);
00205 void createStub(unsigned *stub, Offset stubOffset, Offset newTOC, Offset oldTOC, Offset dest);
00206
00207
00208
00209
00210
00211
00212
00213
00214
00215
00216
00217
00218
00219
00220
00221
00222 Offset layoutTLSImage(Offset globalOffset, Region *dataTLS, Region *bssTLS, LinkMap &lmap);
00223 Offset tlsLayoutVariant1(Offset globalOffset, Region *dataTLS, Region *bssTLS, LinkMap &lmap);
00224 Offset tlsLayoutVariant2(Offset globalOffset, Region *dataTLS, Region *bssTLS, LinkMap &lmap);
00225
00226
00227
00228
00229
00230
00231
00232
00233
00234
00235
00236 Offset adjustTLSOffset(Offset curOffset, Offset tlsSize);
00237 Offset tlsAdjustVariant2(Offset curOffset, Offset tlsSize);
00238
00239
00240
00241
00242
00243
00244
00245
00246
00247
00248
00249 void cleanupTLSRegionOffsets(map<Region *, LinkMap::AllocPair> ®ionAllocs,
00250 Region *dataTLS, Region *bssTLS);
00251 void tlsCleanupVariant1(map<Region *, LinkMap::AllocPair> ®ionAllocs,
00252 Region *dataTLS, Region *bssTLS);
00253 void tlsCleanupVariant2(map<Region *, LinkMap::AllocPair> ®ionAllocs,
00254 Region *dataTLS, Region *bssTLS);
00255
00256
00257
00258
00259
00260
00261
00262
00263
00264
00265 bool isGOTRelocation(unsigned long relType);
00266
00267
00268
00269
00270
00271
00272 void buildGOT(Symtab *target, LinkMap &lmap);
00273
00274
00275
00276
00277
00278
00279 Offset getGOTSize(Symtab *target, LinkMap &lmap, Offset &layoutStart);
00280
00281
00282
00283
00284
00285
00286 Offset getGOTAlign(LinkMap &lmap);
00287
00288
00289
00290
00291
00292
00293 bool isConstructorRegion(Region *reg);
00294
00295
00296
00297
00298
00299
00300
00301
00302
00303 Offset layoutNewCtorRegion(LinkMap &lmap);
00304
00305
00306
00307
00308
00309
00310
00311 bool createNewCtorRegion(LinkMap &lmap);
00312
00313
00314
00315
00316
00317
00318 bool isDestructorRegion(Region *reg);
00319 bool isGOTRegion(Region *reg);
00320
00321
00322
00323
00324
00325
00326
00327
00328
00329 Offset layoutNewDtorRegion(LinkMap &lmap);
00330
00331
00332
00333
00334
00335
00336
00337
00338 bool createNewDtorRegion(LinkMap &lmap);
00339
00340
00341
00342
00343
00344
00345
00346
00347 void getExcludedSymbolNames(std::set<std::string> &symNames);
00348
00349
00350
00351
00352
00353
00354
00355
00356
00357
00358
00359
00360 bool checkSpecialCaseSymbols(Symtab *member, Symbol *checkSym);
00361
00362
00363
00364
00365
00366
00367 bool calculateTOCs(Symtab *target, deque<Region *> ®ions, Offset GOTbase, Offset newGOToffset, Offset globalOffset);
00368
00369
00370
00371
00372
00373
00374
00375 Offset allocatePLTEntries(std::map<Symbol *, std::pair<Offset, Offset> > &entries,
00376 Offset pltOffset, Offset &size);
00377
00378
00379
00380
00381
00382
00383 Offset allocateRelocationSection(std::map<Symbol *, std::pair<Offset, Offset> > &entries,
00384 Offset relocOffset, Offset &size,
00385 Symtab *target);
00386
00387 Offset allocateRelGOTSection(const std::map<Symbol *, std::pair<Offset, Offset> > &entries,
00388 Offset relocOffset, Offset &size);
00389
00390 bool addIndirectSymbol(Symbol *sym, LinkMap &lmap);
00391
00392
00393 bool updateTOC(Symtab *file, LinkMap &lmap, Offset globalOffset);
00394
00395 unsigned addressWidth_;
00396 bool isStripped_;
00397 bool hasRewrittenTLS_;
00398
00399 typedef boost::tuple<Offset, Offset, Offset> TOCstub;
00400 std::map<Symbol *, TOCstub> stubMap;
00401 Offset getStubOffset(TOCstub &t) { return boost::get<0>(t); }
00402 Offset getNewTOC(TOCstub &t) { return boost::get<1>(t); }
00403 Offset getOldTOC(TOCstub &t) { return boost::get<2>(t); }
00404
00405 };
00406
00407 }
00408 }
00409
00410 #endif