diff --git a/lld/ELF/DriverUtils.cpp b/lld/ELF/DriverUtils.cpp index db42b6a36028a57ea47a84bdca306e21a95a92c5..0145d9b9ba0cfdfe59b380ae2365f56c40b0d396 100644 --- a/lld/ELF/DriverUtils.cpp +++ b/lld/ELF/DriverUtils.cpp @@ -68,7 +68,7 @@ static void handleAdltOption(opt::InputArgList &args) { auto *arg = args.getLastArg(OPT_adlt); if (!arg) return; - lld::outs() << "adlt is active\n"; + // slld::outs() << "adlt is active\n"; } static cl::TokenizerCallback getQuotingStyle(opt::InputArgList &args) { diff --git a/lld/ELF/InputFiles.cpp b/lld/ELF/InputFiles.cpp index 25d5fe886bd5406bc1276c2fed3a6b53cde5ca0e..82b685c86a2f4476d8ee712361ffd77f2c92b345 100644 --- a/lld/ELF/InputFiles.cpp +++ b/lld/ELF/InputFiles.cpp @@ -1083,6 +1083,8 @@ void ObjFile::initializeSymbols(const object::ELFFile &obj) { Symbol *sym = symbols[i]; sym->isUsedInRegularObj = true; + if (config->adlt) + sym->exportDynamic = true; if (LLVM_UNLIKELY(eSym.st_shndx == SHN_COMMON)) { if (value == 0 || value >= UINT32_MAX) fatal(toString(this) + ": common symbol '" + sym->getName() + @@ -1111,6 +1113,8 @@ void ObjFile::initializeSymbols(const object::ELFFile &obj) { eSym.getType()}); sym->isUsedInRegularObj = true; sym->referenced = true; + if (config->adlt) + sym->exportDynamic = true; } } diff --git a/lld/ELF/Relocations.cpp b/lld/ELF/Relocations.cpp index ead89a3f74bcfee9d194fcbfe7eaa64c013159ab..ec3228a986cf2a0597d8559dd6b64e2f075ca9f2 100644 --- a/lld/ELF/Relocations.cpp +++ b/lld/ELF/Relocations.cpp @@ -1415,6 +1415,9 @@ void RelocationScanner::processForADLT(const RelTy &rel, Relocation *r, lld::outs() << "[ADLT] R_AARCH64_ADR_GOT_PAGE: sym not in GOT! "; r->expr = R_PC; // prev: R_AARCH64_GOT_PAGE_PC || R_AARCH64_GOT_PAGE || // R_GOT || R_GOT_PC + // TODO: replace reloc R_AARCH64_ADR_GOT_PAGE + sec.relocations.push_back(*r); + return; } LLVM_FALLTHROUGH; case R_AARCH64_LD64_GOT_LO12_NC: diff --git a/lld/ELF/SyntheticSections.cpp b/lld/ELF/SyntheticSections.cpp index 29135ddb16d79ecc5fdafb0355797abb3f9a5b24..8bbfb06d0fe206afc7999a18b3ded0f04b69b63f 100644 --- a/lld/ELF/SyntheticSections.cpp +++ b/lld/ELF/SyntheticSections.cpp @@ -1398,15 +1398,14 @@ DynamicSection::computeContents() { part.dynStrTab->addString(config->rpath)); if (config->adlt) { - StringRef prevNeeded; for (InputFile *file : ctx->sharedFilesExtended) { auto *f = cast>(file); for (size_t i = 0; i < f->dtNeeded.size(); i++) { - StringRef needed = f->dtNeeded[i]; - if (prevNeeded == needed) - continue; - addInt(DT_NEEDED, part.dynStrTab->addString(needed)); - prevNeeded = needed; + auto tag = DT_NEEDED; + auto val = part.dynStrTab->addString(f->dtNeeded[i]); + if (llvm::find(entries, std::pair{tag, val}) == + entries.end()) + addInt(tag, val); } } addInt(DT_SONAME, part.dynStrTab->addString(config->outputFile));