mirror of
https://github.com/rui314/mold.git
synced 2024-10-05 09:07:10 +03:00
Simplify
This commit is contained in:
parent
7a8c14a634
commit
3ad29b230c
30
elf/elf.h
30
elf/elf.h
@ -30,12 +30,7 @@ template <typename E> struct ElfEhdr;
|
||||
template <typename E> struct ElfPhdr;
|
||||
template <typename E> struct ElfRel;
|
||||
template <typename E> struct ElfDyn;
|
||||
template <typename E> struct ElfVerneed;
|
||||
template <typename E> struct ElfVernaux;
|
||||
template <typename E> struct ElfVerdef;
|
||||
template <typename E> struct ElfVerdaux;
|
||||
template <typename E> struct ElfChdr;
|
||||
template <typename E> struct ElfNhdr;
|
||||
|
||||
template <typename E>
|
||||
std::string rel_to_string(u32 r_type);
|
||||
@ -812,7 +807,7 @@ struct Elf32Dyn {
|
||||
u32 d_val;
|
||||
};
|
||||
|
||||
struct Elf64Verneed {
|
||||
struct ElfVerneed {
|
||||
u16 vn_version;
|
||||
u16 vn_cnt;
|
||||
u32 vn_file;
|
||||
@ -820,7 +815,7 @@ struct Elf64Verneed {
|
||||
u32 vn_next;
|
||||
};
|
||||
|
||||
struct Elf64Vernaux {
|
||||
struct ElfVernaux {
|
||||
u32 vna_hash;
|
||||
u16 vna_flags;
|
||||
u16 vna_other;
|
||||
@ -828,7 +823,7 @@ struct Elf64Vernaux {
|
||||
u32 vna_next;
|
||||
};
|
||||
|
||||
struct Elf64Verdef {
|
||||
struct ElfVerdef {
|
||||
u16 vd_version;
|
||||
u16 vd_flags;
|
||||
u16 vd_ndx;
|
||||
@ -838,7 +833,7 @@ struct Elf64Verdef {
|
||||
u32 vd_next;
|
||||
};
|
||||
|
||||
struct Elf64Verdaux {
|
||||
struct ElfVerdaux {
|
||||
u32 vda_name;
|
||||
u32 vda_next;
|
||||
};
|
||||
@ -856,7 +851,7 @@ struct Elf32Chdr {
|
||||
u32 ch_addralign;
|
||||
};
|
||||
|
||||
struct Elf64Nhdr {
|
||||
struct ElfNhdr {
|
||||
u32 n_namesz;
|
||||
u32 n_descsz;
|
||||
u32 n_type;
|
||||
@ -890,12 +885,7 @@ template <> struct ElfEhdr<X86_64> : public Elf64Ehdr {};
|
||||
template <> struct ElfPhdr<X86_64> : public Elf64Phdr {};
|
||||
template <> struct ElfRel<X86_64> : public Elf64Rela {};
|
||||
template <> struct ElfDyn<X86_64> : public Elf64Dyn {};
|
||||
template <> struct ElfVerneed<X86_64> : public Elf64Verneed {};
|
||||
template <> struct ElfVernaux<X86_64> : public Elf64Vernaux {};
|
||||
template <> struct ElfVerdef<X86_64> : public Elf64Verdef {};
|
||||
template <> struct ElfVerdaux<X86_64> : public Elf64Verdaux {};
|
||||
template <> struct ElfChdr<X86_64> : public Elf64Chdr {};
|
||||
template <> struct ElfNhdr<X86_64> : public Elf64Nhdr {};
|
||||
|
||||
struct I386 {
|
||||
using WordTy = u32;
|
||||
@ -925,12 +915,7 @@ template <> struct ElfEhdr<I386> : public Elf32Ehdr {};
|
||||
template <> struct ElfPhdr<I386> : public Elf32Phdr {};
|
||||
template <> struct ElfRel<I386> : public Elf32Rel {};
|
||||
template <> struct ElfDyn<I386> : public Elf32Dyn {};
|
||||
template <> struct ElfVerneed<I386> : public Elf64Verneed {};
|
||||
template <> struct ElfVernaux<I386> : public Elf64Vernaux {};
|
||||
template <> struct ElfVerdef<I386> : public Elf64Verdef {};
|
||||
template <> struct ElfVerdaux<I386> : public Elf64Verdaux {};
|
||||
template <> struct ElfChdr<I386> : public Elf32Chdr {};
|
||||
template <> struct ElfNhdr<I386> : public Elf64Nhdr {};
|
||||
|
||||
struct ARM64 {
|
||||
using WordTy = u64;
|
||||
@ -960,11 +945,6 @@ template <> struct ElfEhdr<ARM64> : public Elf64Ehdr {};
|
||||
template <> struct ElfPhdr<ARM64> : public Elf64Phdr {};
|
||||
template <> struct ElfRel<ARM64> : public Elf64Rela {};
|
||||
template <> struct ElfDyn<ARM64> : public Elf64Dyn {};
|
||||
template <> struct ElfVerneed<ARM64> : public Elf64Verneed {};
|
||||
template <> struct ElfVernaux<ARM64> : public Elf64Vernaux {};
|
||||
template <> struct ElfVerdef<ARM64> : public Elf64Verdef {};
|
||||
template <> struct ElfVerdaux<ARM64> : public Elf64Verdaux {};
|
||||
template <> struct ElfChdr<ARM64> : public Elf64Chdr {};
|
||||
template <> struct ElfNhdr<ARM64> : public Elf64Nhdr {};
|
||||
|
||||
} // namespace mold::elf
|
||||
|
@ -97,7 +97,7 @@ u32 ObjectFile<E>::read_note_gnu_property(Context<E> &ctx,
|
||||
u32 ret = 0;
|
||||
|
||||
while (!data.empty()) {
|
||||
ElfNhdr<E> &hdr = *(ElfNhdr<E> *)data.data();
|
||||
ElfNhdr &hdr = *(ElfNhdr *)data.data();
|
||||
data = data.substr(sizeof(hdr));
|
||||
|
||||
std::string_view name = data.substr(0, hdr.n_namesz - 1);
|
||||
@ -1297,18 +1297,18 @@ std::vector<std::string_view> SharedFile<E>::read_verdef(Context<E> &ctx) {
|
||||
std::string_view verdef = this->get_string(ctx, *verdef_sec);
|
||||
std::string_view strtab = this->get_string(ctx, verdef_sec->sh_link);
|
||||
|
||||
ElfVerdef<E> *ver = (ElfVerdef<E> *)verdef.data();
|
||||
ElfVerdef *ver = (ElfVerdef *)verdef.data();
|
||||
|
||||
for (;;) {
|
||||
if (ret.size() <= ver->vd_ndx)
|
||||
ret.resize(ver->vd_ndx + 1);
|
||||
|
||||
ElfVerdaux<E> *aux = (ElfVerdaux<E> *)((u8 *)ver + ver->vd_aux);
|
||||
ElfVerdaux *aux = (ElfVerdaux *)((u8 *)ver + ver->vd_aux);
|
||||
ret[ver->vd_ndx] = strtab.data() + aux->vda_name;
|
||||
if (!ver->vd_next)
|
||||
break;
|
||||
|
||||
ver = (ElfVerdef<E> *)((u8 *)ver + ver->vd_next);
|
||||
ver = (ElfVerdef *)((u8 *)ver + ver->vd_next);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
@ -1642,14 +1642,13 @@ void VerneedSection<E>::construct(Context<E> &ctx) {
|
||||
ctx.versym->contents[0] = 0;
|
||||
|
||||
// Allocate a large enough buffer for .gnu.version_r.
|
||||
contents.resize((sizeof(ElfVerneed<E>) + sizeof(ElfVernaux<E>)) *
|
||||
syms.size());
|
||||
contents.resize((sizeof(ElfVerneed) + sizeof(ElfVernaux)) * syms.size());
|
||||
|
||||
// Fill .gnu.version_r.
|
||||
u8 *buf = (u8 *)&contents[0];
|
||||
u8 *ptr = buf;
|
||||
ElfVerneed<E> *verneed = nullptr;
|
||||
ElfVernaux<E> *aux = nullptr;
|
||||
ElfVerneed *verneed = nullptr;
|
||||
ElfVernaux *aux = nullptr;
|
||||
|
||||
u16 veridx = VER_NDX_LAST_RESERVED + ctx.arg.version_definitions.size();
|
||||
|
||||
@ -1658,11 +1657,11 @@ void VerneedSection<E>::construct(Context<E> &ctx) {
|
||||
if (verneed)
|
||||
verneed->vn_next = ptr - (u8 *)verneed;
|
||||
|
||||
verneed = (ElfVerneed<E> *)ptr;
|
||||
verneed = (ElfVerneed *)ptr;
|
||||
ptr += sizeof(*verneed);
|
||||
verneed->vn_version = 1;
|
||||
verneed->vn_file = ctx.dynstr->find_string(((SharedFile<E> *)file)->soname);
|
||||
verneed->vn_aux = sizeof(ElfVerneed<E>);
|
||||
verneed->vn_aux = sizeof(ElfVerneed);
|
||||
aux = nullptr;
|
||||
};
|
||||
|
||||
@ -1670,8 +1669,8 @@ void VerneedSection<E>::construct(Context<E> &ctx) {
|
||||
verneed->vn_cnt++;
|
||||
|
||||
if (aux)
|
||||
aux->vna_next = sizeof(ElfVernaux<E>);
|
||||
aux = (ElfVernaux<E> *)ptr;
|
||||
aux->vna_next = sizeof(ElfVernaux);
|
||||
aux = (ElfVernaux *)ptr;
|
||||
ptr += sizeof(*aux);
|
||||
|
||||
std::string_view verstr = sym->get_version();
|
||||
@ -1718,30 +1717,30 @@ void VerdefSection<E>::construct(Context<E> &ctx) {
|
||||
ctx.versym->contents[0] = 0;
|
||||
|
||||
// Allocate a buffer for .gnu.version_d.
|
||||
contents.resize((sizeof(ElfVerdef<E>) + sizeof(ElfVerdaux<E>)) *
|
||||
contents.resize((sizeof(ElfVerdef) + sizeof(ElfVerdaux)) *
|
||||
(ctx.arg.version_definitions.size() + 1));
|
||||
|
||||
u8 *buf = (u8 *)&contents[0];
|
||||
u8 *ptr = buf;
|
||||
ElfVerdef<E> *verdef = nullptr;
|
||||
ElfVerdef *verdef = nullptr;
|
||||
|
||||
auto write = [&](std::string_view verstr, i64 idx, i64 flags) {
|
||||
this->shdr.sh_info++;
|
||||
if (verdef)
|
||||
verdef->vd_next = ptr - (u8 *)verdef;
|
||||
|
||||
verdef = (ElfVerdef<E> *)ptr;
|
||||
ptr += sizeof(ElfVerdef<E>);
|
||||
verdef = (ElfVerdef *)ptr;
|
||||
ptr += sizeof(ElfVerdef);
|
||||
|
||||
verdef->vd_version = 1;
|
||||
verdef->vd_flags = flags;
|
||||
verdef->vd_ndx = idx;
|
||||
verdef->vd_cnt = 1;
|
||||
verdef->vd_hash = elf_hash(verstr);
|
||||
verdef->vd_aux = sizeof(ElfVerdef<E>);
|
||||
verdef->vd_aux = sizeof(ElfVerdef);
|
||||
|
||||
ElfVerdaux<E> *aux = (ElfVerdaux<E> *)ptr;
|
||||
ptr += sizeof(ElfVerdaux<E>);
|
||||
ElfVerdaux *aux = (ElfVerdaux *)ptr;
|
||||
ptr += sizeof(ElfVerdaux);
|
||||
aux->vda_name = ctx.dynstr->add_string(verstr);
|
||||
};
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user