summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBreno Rodrigues Guimaraes <brenorg@gmail.com>2023-02-21 06:49:20 -0300
committerBreno Rodrigues Guimaraes <brenorg@gmail.com>2023-02-21 06:49:20 -0300
commit6de67423cab3b95b1f83667dd5624904f520eef6 (patch)
treeedc2a26f5df61caeab3c2aa9a77b63999d3352a8
parentb09b28f3c732ce25354511b7b2165dd3e4ecf31c (diff)
downloadpatchelf-6de67423cab3b95b1f83667dd5624904f520eef6.tar.gz
Code polishing to use more spans
-rw-r--r--src/patchelf.cc34
-rw-r--r--src/patchelf.h4
2 files changed, 21 insertions, 17 deletions
diff --git a/src/patchelf.cc b/src/patchelf.cc
index afb97f7..829d817 100644
--- a/src/patchelf.cc
+++ b/src/patchelf.cc
@@ -1902,7 +1902,7 @@ auto ElfFile<ElfFileParamNames>::parseGnuHashTable(span<char> sectionData) -> Gn
}
template<ElfFileParams>
-void ElfFile<ElfFileParamNames>::rebuildGnuHashTable(const char* strTab, span<Elf_Sym> dynsyms)
+void ElfFile<ElfFileParamNames>::rebuildGnuHashTable(span<char> strTab, span<Elf_Sym> dynsyms)
{
auto sectionData = tryGetSectionSpan<char>(".gnu.hash");
if (!sectionData)
@@ -1916,12 +1916,12 @@ void ElfFile<ElfFileParamNames>::rebuildGnuHashTable(const char* strTab, span<El
// The hash table includes only a subset of dynsyms
auto firstSymIdx = rdi(ght.m_hdr.symndx);
- dynsyms = span(dynsyms.begin() + firstSymIdx, dynsyms.end());
+ dynsyms = span(&dynsyms[firstSymIdx], dynsyms.end());
// Only use the range of symbol versions that will be changed
auto versyms = tryGetSectionSpan<Elf_Versym>(".gnu.version");
if (versyms)
- versyms = span(versyms.begin() + firstSymIdx, versyms.end());
+ versyms = span(&versyms[firstSymIdx], versyms.end());
struct Entry
{
@@ -1935,7 +1935,7 @@ void ElfFile<ElfFileParamNames>::rebuildGnuHashTable(const char* strTab, span<El
for (auto& sym : dynsyms)
{
Entry e;
- e.hash = gnuHash(strTab + rdi(sym.st_name));
+ e.hash = gnuHash(&strTab[rdi(sym.st_name)]);
e.bucketIdx = e.hash % ght.m_buckets.size();
e.originalPos = pos++;
entries.push_back(e);
@@ -2044,7 +2044,7 @@ auto ElfFile<ElfFileParamNames>::parseHashTable(span<char> sectionData) -> HashT
}
template<ElfFileParams>
-void ElfFile<ElfFileParamNames>::rebuildHashTable(const char* strTab, span<Elf_Sym> dynsyms)
+void ElfFile<ElfFileParamNames>::rebuildHashTable(span<char> strTab, span<Elf_Sym> dynsyms)
{
auto sectionData = tryGetSectionSpan<char>(".hash");
if (!sectionData)
@@ -2055,11 +2055,13 @@ void ElfFile<ElfFileParamNames>::rebuildHashTable(const char* strTab, span<Elf_S
std::fill(ht.m_buckets.begin(), ht.m_buckets.end(), 0);
std::fill(ht.m_chain.begin(), ht.m_chain.end(), 0);
- auto symsToInsert = span(dynsyms.end() - ht.m_chain.size(), dynsyms.end());
+ // The hash table includes only a subset of dynsyms
+ auto firstSymIdx = dynsyms.size() - ht.m_chain.size();
+ dynsyms = span(&dynsyms[firstSymIdx], dynsyms.end());
- for (auto& sym : symsToInsert)
+ for (auto& sym : dynsyms)
{
- auto name = strTab + rdi(sym.st_name);
+ auto name = &strTab[rdi(sym.st_name)];
uint32_t i = &sym - dynsyms.begin();
uint32_t hash = sysvHash(name) % ht.m_buckets.size();
wri(ht.m_chain[i], rdi(ht.m_buckets[hash]));
@@ -2075,27 +2077,29 @@ void ElfFile<ElfFileParamNames>::renameDynamicSymbols(const std::unordered_map<s
std::vector<char> extraStrings;
extraStrings.reserve(remap.size() * 30); // Just an estimate
- for (size_t i = 0; i < dynsyms.size(); i++)
+ for (auto& dynsym : dynsyms)
{
- auto& dynsym = dynsyms[i];
std::string_view name = &strTab[rdi(dynsym.st_name)];
auto it = remap.find(name);
if (it != remap.end())
{
wri(dynsym.st_name, strTab.size() + extraStrings.size());
auto& newName = it->second;
- extraStrings.insert(extraStrings.end(), newName.data(), newName.data() + newName.size() + 1);
+ extraStrings.insert(extraStrings.end(), newName.begin(), newName.end() + 1);
changed = true;
}
}
if (changed)
{
- auto& newSec = replaceSection(".dynstr", strTab.size() + extraStrings.size());
- std::copy(extraStrings.begin(), extraStrings.end(), newSec.begin() + strTab.size());
+ auto newStrTabSize = strTab.size() + extraStrings.size();
+ auto& newSec = replaceSection(".dynstr", newStrTabSize);
+ auto newStrTabSpan = span(newSec.data(), newStrTabSize);
+
+ std::copy(extraStrings.begin(), extraStrings.end(), &newStrTabSpan[strTab.size()]);
- rebuildGnuHashTable(newSec.data(), dynsyms);
- rebuildHashTable(newSec.data(), dynsyms);
+ rebuildGnuHashTable(newStrTabSpan, dynsyms);
+ rebuildHashTable(newStrTabSpan, dynsyms);
}
this->rewriteSections();
diff --git a/src/patchelf.h b/src/patchelf.h
index faa6e1a..29c11c2 100644
--- a/src/patchelf.h
+++ b/src/patchelf.h
@@ -183,8 +183,8 @@ public:
};
HashTable parseHashTable(span<char> gh);
- void rebuildGnuHashTable(const char* strTab, span<Elf_Sym> dynsyms);
- void rebuildHashTable(const char* strTab, span<Elf_Sym> dynsyms);
+ void rebuildGnuHashTable(span<char> strTab, span<Elf_Sym> dynsyms);
+ void rebuildHashTable(span<char> strTab, span<Elf_Sym> dynsyms);
using Elf_Rel_Info = decltype(Elf_Rel::r_info);