@@ -2293,6 +2293,42 @@ void ElfFile<ElfFileParamNames>::modifyExecstack(ExecstackMode op)
22932293 printf (" execstack: %c\n " , result);
22942294}
22952295
2296+ template <ElfFileParams>
2297+ template <class StrIdxCallback >
2298+ void ElfFile<ElfFileParamNames>::forAllStringReferences(Elf_Shdr& strTabHdr, StrIdxCallback&& fn)
2299+ {
2300+ for (auto & sym : tryGetSectionSpan<Elf_Sym>(" .dynsym" ))
2301+ fn (sym.st_name );
2302+
2303+ for (auto & dyn : tryGetSectionSpan<Elf_Dyn>(" .dynamic" ))
2304+ switch (rdi (dyn.d_tag ))
2305+ {
2306+ case DT_NEEDED:
2307+ case DT_SONAME:
2308+ case DT_RPATH:
2309+ case DT_RUNPATH: fn (dyn.d_un .d_val );
2310+ default :;
2311+ }
2312+
2313+ if (auto verdHdr = tryFindSectionHeader (" .gnu.version_d" ))
2314+ {
2315+ if (&shdrs.at (rdi (verdHdr->get ().sh_link )) == &strTabHdr)
2316+ forAll_ElfVer (getSectionSpan<Elf_Verdef>(*verdHdr),
2317+ [] (auto & /* vd*/ ) {},
2318+ [&] (auto & vda) { fn (vda.vda_name ); }
2319+ );
2320+ }
2321+
2322+ if (auto vernHdr = tryFindSectionHeader (" .gnu.version_r" ))
2323+ {
2324+ if (&shdrs.at (rdi (vernHdr->get ().sh_link )) == &strTabHdr)
2325+ forAll_ElfVer (getSectionSpan<Elf_Verneed>(*vernHdr),
2326+ [&] (auto & vn) { fn (vn.vn_file ); },
2327+ [&] (auto & vna) { fn (vna.vna_name ); }
2328+ );
2329+ }
2330+ }
2331+
22962332static bool printInterpreter = false ;
22972333static bool printOsAbi = false ;
22982334static bool setOsAbi = false ;
@@ -2397,9 +2433,9 @@ static void patchElf()
23972433 const std::string & outputFileName2 = outputFileName.empty () ? fileName : outputFileName;
23982434
23992435 if (getElfType (fileContents).is32Bit )
2400- patchElf2 (ElfFile<Elf32_Ehdr, Elf32_Phdr, Elf32_Shdr, Elf32_Addr, Elf32_Off, Elf32_Dyn, Elf32_Sym, Elf32_Verneed, Elf32_Versym , Elf32_Rel, Elf32_Rela, 32 >(fileContents), fileContents, outputFileName2);
2436+ patchElf2 (ElfFile<Elf32_Ehdr, Elf32_Phdr, Elf32_Shdr, Elf32_Addr, Elf32_Off, Elf32_Dyn, Elf32_Sym, Elf32_Versym, Elf32_Verdef, Elf32_Verdaux, Elf32_Verneed, Elf32_Vernaux , Elf32_Rel, Elf32_Rela, 32 >(fileContents), fileContents, outputFileName2);
24012437 else
2402- patchElf2 (ElfFile<Elf64_Ehdr, Elf64_Phdr, Elf64_Shdr, Elf64_Addr, Elf64_Off, Elf64_Dyn, Elf64_Sym, Elf64_Verneed, Elf64_Versym , Elf64_Rel, Elf64_Rela, 64 >(fileContents), fileContents, outputFileName2);
2438+ patchElf2 (ElfFile<Elf64_Ehdr, Elf64_Phdr, Elf64_Shdr, Elf64_Addr, Elf64_Off, Elf64_Dyn, Elf64_Sym, Elf64_Versym, Elf64_Verdef, Elf64_Verdaux, Elf64_Verneed, Elf64_Vernaux , Elf64_Rel, Elf64_Rela, 64 >(fileContents), fileContents, outputFileName2);
24032439 }
24042440}
24052441
0 commit comments