Skip to content

Commit 622712c

Browse files
committed
Simplify code and add missing wri/rdi
1 parent 2398917 commit 622712c

File tree

2 files changed

+28
-35
lines changed

2 files changed

+28
-35
lines changed

src/patchelf.cc

Lines changed: 19 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1892,11 +1892,11 @@ static uint32_t gnuHash(std::string_view name) {
18921892
}
18931893

18941894
template<ElfFileParams>
1895-
auto ElfFile<ElfFileParamNames>::GnuHashTable::parse(span<char> sectionData) -> GnuHashTable
1895+
auto ElfFile<ElfFileParamNames>::parseGnuHashTable(span<char> sectionData) -> GnuHashTable
18961896
{
1897-
auto hdr = (Header*)sectionData.begin();
1898-
auto bloomFilters = span((BloomWord*)(hdr+1), hdr->maskwords);
1899-
auto buckets = span((uint32_t*)bloomFilters.end(), hdr->numBuckets);
1897+
auto hdr = (typename GnuHashTable::Header*)sectionData.begin();
1898+
auto bloomFilters = span((typename GnuHashTable::BloomWord*)(hdr+1), rdi(hdr->maskwords));
1899+
auto buckets = span((uint32_t*)bloomFilters.end(), rdi(hdr->numBuckets));
19001900
auto table = span(buckets.end(), ((uint32_t*)sectionData.end()) - buckets.end());
19011901
return GnuHashTable{*hdr, bloomFilters, buckets, table};
19021902
}
@@ -1908,11 +1908,10 @@ void ElfFile<ElfFileParamNames>::rebuildGnuHashTable(const char* strTab, span<El
19081908
if (!sectionData)
19091909
return;
19101910

1911-
auto ght = GnuHashTable::parse(sectionData);
1911+
auto ght = parseGnuHashTable(sectionData);
19121912

1913-
// Only work with the last "m_table.size()" symbols from dynsyms which are the
1914-
// symbols that belong to the hash table
1915-
auto firstSymIdx = dynsyms.size() - ght.m_table.size();
1913+
// The hash table includes only a subset of dynsyms
1914+
auto firstSymIdx = rdi(ght.m_hdr.symndx);
19161915
auto symsToInsert = span(dynsyms.begin() + firstSymIdx, dynsyms.end());
19171916

19181917
// Only use the range of symbol versions that will be changed
@@ -1933,7 +1932,7 @@ void ElfFile<ElfFileParamNames>::rebuildGnuHashTable(const char* strTab, span<El
19331932
{
19341933
Entry e;
19351934
e.hash = gnuHash(strTab + rdi(sym.st_name));
1936-
e.bucketIdx = e.hash % ght.m_hdr.numBuckets;
1935+
e.bucketIdx = e.hash % rdi(ght.m_hdr.numBuckets);
19371936
e.originalPos = pos++;
19381937
entries.push_back(e);
19391938
}
@@ -1993,10 +1992,10 @@ void ElfFile<ElfFileParamNames>::rebuildGnuHashTable(const char* strTab, span<El
19931992
for (size_t i = 0; i < entries.size(); ++i)
19941993
{
19951994
auto h = entries[i].hash;
1996-
size_t idx = (h / ElfWordSize) % ght.m_bloomFilters.size();
1995+
size_t idx = (h / ElfClass) % ght.m_bloomFilters.size();
19971996
auto val = rdi(ght.m_bloomFilters[idx]);
1998-
val |= uint64_t(1) << (h % ElfWordSize);
1999-
val |= uint64_t(1) << ((h >> ght.m_hdr.shift2) % ElfWordSize);
1997+
val |= uint64_t(1) << (h % ElfClass);
1998+
val |= uint64_t(1) << ((h >> ght.m_hdr.shift2) % ElfClass);
20001999
wri(ght.m_bloomFilters[idx], val);
20012000
}
20022001

@@ -2006,7 +2005,7 @@ void ElfFile<ElfFileParamNames>::rebuildGnuHashTable(const char* strTab, span<El
20062005
{
20072006
auto symBucketIdx = entries[i].bucketIdx;
20082007
if (!ght.m_buckets[symBucketIdx])
2009-
ght.m_buckets[symBucketIdx] = i + ght.m_hdr.symndx;
2008+
wri(ght.m_buckets[symBucketIdx], i + firstSymIdx);
20102009
}
20112010

20122011
// Fill hash table
@@ -2015,7 +2014,7 @@ void ElfFile<ElfFileParamNames>::rebuildGnuHashTable(const char* strTab, span<El
20152014
auto& n = entries[i];
20162015
bool isLast = (i == entries.size() - 1) || (n.bucketIdx != entries[i+1].bucketIdx);
20172016
// Add hash with first bit indicating end of chain
2018-
ght.m_table[i] = isLast ? (n.hash | 1) : (n.hash & ~1);
2017+
wri(ght.m_table[i], isLast ? (n.hash | 1) : (n.hash & ~1));
20192018
}
20202019
}
20212020

@@ -2033,10 +2032,10 @@ static uint32_t sysvHash(std::string_view name) {
20332032
}
20342033

20352034
template<ElfFileParams>
2036-
auto ElfFile<ElfFileParamNames>::HashTable::parse(span<char> sectionData) -> HashTable
2035+
auto ElfFile<ElfFileParamNames>::parseHashTable(span<char> sectionData) -> HashTable
20372036
{
2038-
auto hdr = (Header*)sectionData.begin();
2039-
auto buckets = span((uint32_t*)(hdr+1), hdr->numBuckets);
2037+
auto hdr = (typename HashTable::Header*)sectionData.begin();
2038+
auto buckets = span((uint32_t*)(hdr+1), rdi(hdr->numBuckets));
20402039
auto table = span(buckets.end(), ((uint32_t*)sectionData.end()) - buckets.end());
20412040
return HashTable{*hdr, buckets, table};
20422041
}
@@ -2048,7 +2047,7 @@ void ElfFile<ElfFileParamNames>::rebuildHashTable(const char* strTab, span<Elf_S
20482047
if (!sectionData)
20492048
return;
20502049

2051-
auto ht = HashTable::parse(sectionData);
2050+
auto ht = parseHashTable(sectionData);
20522051

20532052
std::fill(ht.m_buckets.begin(), ht.m_buckets.end(), 0);
20542053
std::fill(ht.m_chain.begin(), ht.m_chain.end(), 0);
@@ -2222,9 +2221,9 @@ static void patchElf()
22222221
const std::string & outputFileName2 = outputFileName.empty() ? fileName : outputFileName;
22232222

22242223
if (getElfType(fileContents).is32Bit)
2225-
patchElf2(ElfFile<Elf32_Ehdr, Elf32_Phdr, Elf32_Shdr, Elf32_Addr, Elf32_Off, Elf32_Dyn, Elf32_Sym, Elf32_Verneed, Elf32_Versym, Elf32_Rel, Elf32_Rela>(fileContents), fileContents, outputFileName2);
2224+
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);
22262225
else
2227-
patchElf2(ElfFile<Elf64_Ehdr, Elf64_Phdr, Elf64_Shdr, Elf64_Addr, Elf64_Off, Elf64_Dyn, Elf64_Sym, Elf64_Verneed, Elf64_Versym, Elf64_Rel, Elf64_Rela>(fileContents), fileContents, outputFileName2);
2226+
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);
22282227
}
22292228
}
22302229

src/patchelf.h

Lines changed: 9 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
using FileContents = std::shared_ptr<std::vector<unsigned char>>;
22

3-
#define ElfFileParams class Elf_Ehdr, class Elf_Phdr, class Elf_Shdr, class Elf_Addr, class Elf_Off, class Elf_Dyn, class Elf_Sym, class Elf_Verneed, class Elf_Versym, class Elf_Rel, class Elf_Rela
4-
#define ElfFileParamNames Elf_Ehdr, Elf_Phdr, Elf_Shdr, Elf_Addr, Elf_Off, Elf_Dyn, Elf_Sym, Elf_Verneed, Elf_Versym, Elf_Rel, Elf_Rela
3+
#define ElfFileParams class Elf_Ehdr, class Elf_Phdr, class Elf_Shdr, class Elf_Addr, class Elf_Off, class Elf_Dyn, class Elf_Sym, class Elf_Verneed, class Elf_Versym, class Elf_Rel, class Elf_Rela, unsigned ElfClass
4+
#define ElfFileParamNames Elf_Ehdr, Elf_Phdr, Elf_Shdr, Elf_Addr, Elf_Off, Elf_Dyn, Elf_Sym, Elf_Verneed, Elf_Versym, Elf_Rel, Elf_Rela, ElfClass
55

66
template<class T>
77
struct span
@@ -158,31 +158,25 @@ class ElfFile
158158

159159
void renameDynamicSymbols(const std::unordered_map<std::string_view, std::string>&);
160160

161-
static constexpr auto ElfWordSize = std::is_same_v<Elf_Sym, Elf64_Sym> ? 64 : 32;
162-
struct GnuHashTable
163-
{
164-
using BloomWord = std::conditional_t<ElfWordSize == 32, uint32_t, uint64_t>;
165-
166-
static GnuHashTable parse(span<char> gh);
167-
161+
struct GnuHashTable {
162+
using BloomWord = Elf_Addr;
168163
struct Header {
169164
uint32_t numBuckets, symndx, maskwords, shift2;
170165
} m_hdr;
171166
span<BloomWord> m_bloomFilters;
172167
span<uint32_t> m_buckets, m_table;
173168
};
169+
GnuHashTable parseGnuHashTable(span<char> gh);
174170

175-
void rebuildGnuHashTable(const char* strTab, span<Elf_Sym> dynsyms);
176-
177-
struct HashTable
178-
{
179-
static HashTable parse(span<char> gh);
180-
171+
struct HashTable {
181172
struct Header {
182173
uint32_t numBuckets, nchain;
183174
} m_hdr;
184175
span<uint32_t> m_buckets, m_chain;
185176
};
177+
HashTable parseHashTable(span<char> gh);
178+
179+
void rebuildGnuHashTable(const char* strTab, span<Elf_Sym> dynsyms);
186180
void rebuildHashTable(const char* strTab, span<Elf_Sym> dynsyms);
187181

188182
using Elf_Rel_Info = decltype(Elf_Rel::r_info);

0 commit comments

Comments
 (0)