mirror of
https://github.com/rui314/mold.git
synced 2024-12-29 11:24:36 +03:00
temporary
This commit is contained in:
parent
59ad6a1430
commit
dc20816a57
40
main.cc
40
main.cc
@ -449,21 +449,24 @@ static void sort_output_chunks(std::vector<OutputChunk *> &chunks) {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
static std::vector<ELF64LE::Shdr *>
|
template<typename T>
|
||||||
create_shdr(ArrayRef<OutputChunk *> output_chunks) {
|
static std::vector<u8> to_u8vector(const std::vector<T> &vec) {
|
||||||
static ELF64LE::Shdr null_entry = {};
|
std::vector<u8> ret(vec.size() * sizeof(T));
|
||||||
|
memcpy(ret.data(), vec.data(), vec.size());
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
std::vector<ELF64LE::Shdr *> vec;
|
static std::vector<u8> create_shdr(ArrayRef<OutputChunk *> output_chunks) {
|
||||||
vec.push_back(&null_entry);
|
std::vector<ELF64LE::Shdr> vec(1);
|
||||||
|
|
||||||
int shndx = 1;
|
int shndx = 1;
|
||||||
for (OutputChunk *chunk : output_chunks) {
|
for (OutputChunk *chunk : output_chunks) {
|
||||||
if (chunk->kind != OutputChunk::HEADER) {
|
if (chunk->kind != OutputChunk::HEADER) {
|
||||||
vec.push_back(&chunk->shdr);
|
vec.push_back(chunk->shdr);
|
||||||
chunk->shndx = shndx++;
|
chunk->shndx = shndx++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return vec;
|
return to_u8vector(vec);
|
||||||
}
|
}
|
||||||
|
|
||||||
static u32 to_phdr_flags(u64 sh_flags) {
|
static u32 to_phdr_flags(u64 sh_flags) {
|
||||||
@ -556,10 +559,7 @@ static std::vector<u8> create_dynamic_section() {
|
|||||||
|
|
||||||
define(DT_RELAENT, sizeof(ELF64LE::Rela));
|
define(DT_RELAENT, sizeof(ELF64LE::Rela));
|
||||||
define(DT_NULL, 0);
|
define(DT_NULL, 0);
|
||||||
|
return to_u8vector(vec);
|
||||||
std::vector<u8> ret(vec.size() * 8);
|
|
||||||
memcpy(ret.data(), vec.data(), ret.size());
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static u64 set_osec_offsets(ArrayRef<OutputChunk *> output_chunks) {
|
static u64 set_osec_offsets(ArrayRef<OutputChunk *> output_chunks) {
|
||||||
@ -770,6 +770,10 @@ void parallel_write(int fd, u8 *buf, u64 size) {
|
|||||||
write_loop(num_units * unit, size % unit);
|
write_loop(num_units * unit, size % unit);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void write_vector(u8 *buf, ArrayRef<u8> vec) {
|
||||||
|
memcpy(buf, vec.data(), vec.size());
|
||||||
|
}
|
||||||
|
|
||||||
int main(int argc, char **argv) {
|
int main(int argc, char **argv) {
|
||||||
// Parse command line options
|
// Parse command line options
|
||||||
MyOptTable opt_table;
|
MyOptTable opt_table;
|
||||||
@ -967,7 +971,7 @@ int main(int argc, char **argv) {
|
|||||||
chunk->shdr.sh_name = out::shstrtab.add_string(chunk->name);
|
chunk->shdr.sh_name = out::shstrtab.add_string(chunk->name);
|
||||||
|
|
||||||
// Initialize synthetic section contents
|
// Initialize synthetic section contents
|
||||||
out::shdr.set_entries(create_shdr(output_chunks));
|
out::shdr.shdr.sh_size = create_shdr(output_chunks).size();
|
||||||
out::phdr.set_entries(create_phdr(output_chunks));
|
out::phdr.set_entries(create_phdr(output_chunks));
|
||||||
if (out::dynamic.shdr.sh_size)
|
if (out::dynamic.shdr.sh_size)
|
||||||
out::dynamic.shdr.sh_size = create_dynamic_section().size();
|
out::dynamic.shdr.sh_size = create_dynamic_section().size();
|
||||||
@ -1024,15 +1028,10 @@ int main(int argc, char **argv) {
|
|||||||
out::shdr.copy_to(buf);
|
out::shdr.copy_to(buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Fill .plt, .got, got.plt, .rela.plt and .dynamic sections
|
// Fill .plt, .got, got.plt, .rela.plt sections
|
||||||
{
|
{
|
||||||
MyTimer t("write_synthetic", copy);
|
MyTimer t("write_synthetic", copy);
|
||||||
write_got(buf, files);
|
write_got(buf, files);
|
||||||
|
|
||||||
if (out::dynamic.shdr.sh_size) {
|
|
||||||
std::vector<u8> vec = create_dynamic_section();
|
|
||||||
memcpy(buf + out::dynamic.shdr.sh_offset, vec.data(), vec.size());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Fill mergeable string sections
|
// Fill mergeable string sections
|
||||||
@ -1041,6 +1040,11 @@ int main(int argc, char **argv) {
|
|||||||
write_merged_strings(buf, files);
|
write_merged_strings(buf, files);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Write headers and synthetic sections.
|
||||||
|
write_vector(buf + out::shdr.shdr.sh_offset, create_shdr(output_chunks));
|
||||||
|
if (out::dynamic.shdr.sh_size)
|
||||||
|
write_vector(buf + out::dynamic.shdr.sh_offset, create_dynamic_section());
|
||||||
|
|
||||||
// Zero-clear paddings between sections
|
// Zero-clear paddings between sections
|
||||||
{
|
{
|
||||||
MyTimer t("clear_padding", copy);
|
MyTimer t("clear_padding", copy);
|
||||||
|
13
mold.h
13
mold.h
@ -305,19 +305,6 @@ public:
|
|||||||
OutputShdr() : OutputChunk(HEADER) {
|
OutputShdr() : OutputChunk(HEADER) {
|
||||||
shdr.sh_flags = llvm::ELF::SHF_ALLOC;
|
shdr.sh_flags = llvm::ELF::SHF_ALLOC;
|
||||||
}
|
}
|
||||||
|
|
||||||
void copy_to(u8 *buf) override {
|
|
||||||
auto *p = (ELF64LE::Shdr *)(buf + shdr.sh_offset);
|
|
||||||
for (ELF64LE::Shdr *ent : entries)
|
|
||||||
*p++ = *ent;
|
|
||||||
}
|
|
||||||
|
|
||||||
void set_entries(std::vector<ELF64LE::Shdr *> vec) {
|
|
||||||
shdr.sh_size = vec.size() * sizeof(ELF64LE::Shdr);
|
|
||||||
entries = std::move(vec);
|
|
||||||
}
|
|
||||||
|
|
||||||
std::vector<ELF64LE::Shdr *> entries;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
// Program header
|
// Program header
|
||||||
|
@ -25,7 +25,7 @@ void OutputEhdr::copy_to(u8 *buf) {
|
|||||||
hdr.e_phentsize = sizeof(ELF64LE::Phdr);
|
hdr.e_phentsize = sizeof(ELF64LE::Phdr);
|
||||||
hdr.e_phnum = out::phdr.shdr.sh_size / sizeof(ELF64LE::Phdr);
|
hdr.e_phnum = out::phdr.shdr.sh_size / sizeof(ELF64LE::Phdr);
|
||||||
hdr.e_shentsize = sizeof(ELF64LE::Shdr);
|
hdr.e_shentsize = sizeof(ELF64LE::Shdr);
|
||||||
hdr.e_shnum = out::shdr.entries.size();
|
hdr.e_shnum = out::shdr.shdr.sh_size / sizeof(ELF64LE::Shdr);
|
||||||
hdr.e_shstrndx = out::shstrtab.shndx;
|
hdr.e_shstrndx = out::shstrtab.shndx;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user