1
1
mirror of https://github.com/rui314/mold.git synced 2024-10-05 09:07:10 +03:00
This commit is contained in:
Rui Ueyama 2022-01-16 15:17:31 +09:00
parent 7a8c14a634
commit 3ad29b230c
3 changed files with 23 additions and 44 deletions

View File

@ -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

View File

@ -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;
}

View File

@ -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);
};