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

View File

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

View File

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