X-Git-Url: https://git.saurik.com/apple/ld64.git/blobdiff_plain/b1f7435d66a93f03b77932b3a9ad8a83ce5e1ebc..d425e3882ca60fabae080ddb890789ef2e73a66b:/src/ld/parsers/macho_dylib_file.cpp diff --git a/src/ld/parsers/macho_dylib_file.cpp b/src/ld/parsers/macho_dylib_file.cpp index 20b062b..aad1a8b 100644 --- a/src/ld/parsers/macho_dylib_file.cpp +++ b/src/ld/parsers/macho_dylib_file.cpp @@ -33,8 +33,8 @@ #include #include #include -#include -#include +#include +#include #include "Architectures.hpp" #include "MachOFileAbstraction.hpp" @@ -178,14 +178,17 @@ private: friend class ExportAtom; friend class ImportAtom; - class CStringEquals - { - public: - bool operator()(const char* left, const char* right) const { return (strcmp(left, right) == 0); } + struct CStringHash { + std::size_t operator()(const char* __s) const { + unsigned long __h = 0; + for ( ; *__s; ++__s) + __h = 5 * __h + *__s; + return size_t(__h); + }; }; struct AtomAndWeak { ld::Atom* atom; bool weakDef; bool tlv; pint_t address; }; - typedef __gnu_cxx::hash_map, CStringEquals> NameToAtomMap; - typedef __gnu_cxx::hash_set, CStringEquals> NameSet; + typedef std::unordered_map NameToAtomMap; + typedef std::unordered_set NameSet; struct Dependent { const char* path; File* dylib; bool reExport; }; @@ -506,14 +509,14 @@ void File::buildExportHashTableFromSymbolTable(const macho_dysymtab_command

nextdefsym(), this->path()); const macho_nlist

* start = &symbolTable[dynamicInfo->iextdefsym()]; const macho_nlist

* end = &start[dynamicInfo->nextdefsym()]; - _atoms.resize(dynamicInfo->nextdefsym()); // set initial bucket count + _atoms.reserve(dynamicInfo->nextdefsym()); // set initial bucket count for (const macho_nlist

* sym=start; sym < end; ++sym) { this->addSymbol(&strings[sym->n_strx()], (sym->n_desc() & N_WEAK_DEF) != 0, false, sym->n_value()); } } else { int32_t count = dynamicInfo->ntoc(); - _atoms.resize(count); // set initial bucket count + _atoms.reserve(count); // set initial bucket count if ( _s_logHashtable ) fprintf(stderr, "ld: building hashtable of %u entries for %s\n", count, this->path()); const struct dylib_table_of_contents* toc = (dylib_table_of_contents*)(fileContent + dynamicInfo->tocoff()); for (int32_t i = 0; i < count; ++i) { @@ -569,9 +572,6 @@ void File::addDyldFastStub() template void File::addSymbol(const char* name, bool weakDef, bool tlv, pint_t address) { - if ( weakDef ) { - assert(_hasWeakExports); - } //fprintf(stderr, "addSymbol() %s\n", name); // symbols that start with $ld$ are meta-data to the static linker // need way for ld and dyld to see different exported symbols in a dylib @@ -700,7 +700,7 @@ bool File::containsOrReExports(const char* name, bool* weakDef, bool* tlv, pi if ( _ignoreExports.count(name) != 0 ) return false; -// check myself + // check myself typename NameToAtomMap::iterator pos = _atoms.find(name); if ( pos != _atoms.end() ) { *weakDef = pos->second.weakDef;