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