mirror of
https://github.com/rui314/mold.git
synced 2024-12-27 02:13:33 +03:00
temporary
This commit is contained in:
parent
851415fdc9
commit
bed207a4ec
2
Makefile
2
Makefile
@ -7,7 +7,7 @@ LLVM_LIBS=$(wildcard llvm-project/build/lib/libLLVM*.a)
|
|||||||
CURRENT_DIR=$(shell pwd)
|
CURRENT_DIR=$(shell pwd)
|
||||||
TBB_LIBDIR=$(wildcard $(CURRENT_DIR)/oneTBB/build/linux_intel64_*_release/)
|
TBB_LIBDIR=$(wildcard $(CURRENT_DIR)/oneTBB/build/linux_intel64_*_release/)
|
||||||
|
|
||||||
CPPFLAGS=-g $(shell $(LLVM_CONFIG) --cxxflags) -IoneTBB/include -pthread -std=c++17
|
CPPFLAGS=-g $(shell $(LLVM_CONFIG) --cxxflags) -IoneTBB/include -pthread -std=c++17 -O2
|
||||||
LDFLAGS=$(shell $(LLVM_CONFIG) --ldflags) -L$(TBB_LIBDIR) -Wl,-rpath=$(TBB_LIBDIR) -fuse-ld=lld
|
LDFLAGS=$(shell $(LLVM_CONFIG) --ldflags) -L$(TBB_LIBDIR) -Wl,-rpath=$(TBB_LIBDIR) -fuse-ld=lld
|
||||||
LIBS=-pthread -ltbb -lcurses -Wl,--start-group $(LLVM_LIBS) -Wl,--end-group
|
LIBS=-pthread -ltbb -lcurses -Wl,--start-group $(LLVM_LIBS) -Wl,--end-group
|
||||||
OBJS=main.o object_file.o input_sections.o output_chunks.o mapfile.o perf.o
|
OBJS=main.o object_file.o input_sections.o output_chunks.o mapfile.o perf.o
|
||||||
|
@ -24,7 +24,9 @@ void InputSection::copy_to(u8 *buf) {
|
|||||||
memcpy(buf, &data[0], data.size());
|
memcpy(buf, &data[0], data.size());
|
||||||
}
|
}
|
||||||
|
|
||||||
void InputSection::scan_relocations() {
|
ScanRelResult InputSection::scan_relocations() {
|
||||||
|
ScanRelResult res;
|
||||||
|
|
||||||
for (const ELF64LE::Rela &rel : rels) {
|
for (const ELF64LE::Rela &rel : rels) {
|
||||||
Symbol *sym = file->symbols[rel.getSymbol(false)];
|
Symbol *sym = file->symbols[rel.getSymbol(false)];
|
||||||
if (!sym->file || !sym->file->is_alive)
|
if (!sym->file || !sym->file->is_alive)
|
||||||
@ -43,7 +45,7 @@ void InputSection::scan_relocations() {
|
|||||||
std::lock_guard lock(sym->mu);
|
std::lock_guard lock(sym->mu);
|
||||||
if (!sym->needs_got) {
|
if (!sym->needs_got) {
|
||||||
sym->needs_got = true;
|
sym->needs_got = true;
|
||||||
file->num_got++;
|
res.num_got++;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -51,7 +53,7 @@ void InputSection::scan_relocations() {
|
|||||||
std::lock_guard lock(sym->mu);
|
std::lock_guard lock(sym->mu);
|
||||||
if (!sym->needs_gottp) {
|
if (!sym->needs_gottp) {
|
||||||
sym->needs_gottp = true;
|
sym->needs_gottp = true;
|
||||||
file->num_got++;
|
res.num_got++;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -62,14 +64,15 @@ void InputSection::scan_relocations() {
|
|||||||
std::lock_guard lock(sym->mu);
|
std::lock_guard lock(sym->mu);
|
||||||
if (!sym->needs_plt) {
|
if (!sym->needs_plt) {
|
||||||
sym->needs_plt = true;
|
sym->needs_plt = true;
|
||||||
file->num_plt++;
|
res.num_plt++;
|
||||||
file->num_gotplt++;
|
res.num_gotplt++;
|
||||||
file->num_relplt++;
|
res.num_relplt++;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
void InputSection::relocate(u8 *buf) {
|
void InputSection::relocate(u8 *buf) {
|
||||||
@ -146,7 +149,7 @@ void InputSection::relocate(u8 *buf) {
|
|||||||
error(toString(this) + ": unknown relocation: " +
|
error(toString(this) + ": unknown relocation: " +
|
||||||
std::to_string(rel.getType(false)));
|
std::to_string(rel.getType(false)));
|
||||||
}
|
}
|
||||||
|
|
||||||
static Counter counter("relocs");
|
static Counter counter("relocs");
|
||||||
counter.inc();
|
counter.inc();
|
||||||
}
|
}
|
||||||
|
34
main.cc
34
main.cc
@ -232,26 +232,22 @@ static void set_isec_offsets() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void scan_rels(ArrayRef<ObjectFile *> files) {
|
static void scan_rels(ArrayRef<ObjectFile *> files) {
|
||||||
std::atomic_int32_t num_got = 0;
|
ScanRelResult res =
|
||||||
std::atomic_int32_t num_gotplt = 0;
|
tbb::parallel_reduce(tbb::blocked_range<int>(0, files.size()),
|
||||||
std::atomic_int32_t num_plt = 0;
|
ScanRelResult(),
|
||||||
std::atomic_int32_t num_relplt = 0;
|
[&](const tbb::blocked_range<int> &r, ScanRelResult res) {
|
||||||
|
for (int i = r.begin(); i != r.end(); i++)
|
||||||
|
res = res.add(files[i]->scan_relocations());
|
||||||
|
return res;
|
||||||
|
},
|
||||||
|
[](const ScanRelResult &x, const ScanRelResult &y) {
|
||||||
|
return x.add(y);
|
||||||
|
});
|
||||||
|
|
||||||
for_each(files, [&](ObjectFile *file) {
|
out::got->shdr.sh_size = res.num_got * 8;
|
||||||
for (InputSection *isec : file->sections)
|
out::gotplt->shdr.sh_size = res.num_gotplt * 8;
|
||||||
if (isec)
|
out::plt->shdr.sh_size = res.num_plt * 16;
|
||||||
isec->scan_relocations();
|
out::relplt->shdr.sh_size = res.num_relplt * sizeof(ELF64LE::Rela);
|
||||||
|
|
||||||
num_got += file->num_got;
|
|
||||||
num_gotplt += file->num_gotplt;
|
|
||||||
num_plt += file->num_plt;
|
|
||||||
num_relplt += file->num_relplt;
|
|
||||||
});
|
|
||||||
|
|
||||||
out::got->shdr.sh_size = num_got * 8;
|
|
||||||
out::gotplt->shdr.sh_size = num_gotplt * 8;
|
|
||||||
out::plt->shdr.sh_size = num_plt * 16;
|
|
||||||
out::relplt->shdr.sh_size = num_relplt * sizeof(ELF64LE::Rela);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void assign_got_offsets(u8 *buf, ArrayRef<ObjectFile *> files) {
|
static void assign_got_offsets(u8 *buf, ArrayRef<ObjectFile *> files) {
|
||||||
|
27
mold.h
27
mold.h
@ -12,6 +12,7 @@
|
|||||||
#include "tbb/concurrent_hash_map.h"
|
#include "tbb/concurrent_hash_map.h"
|
||||||
#include "tbb/global_control.h"
|
#include "tbb/global_control.h"
|
||||||
#include "tbb/parallel_for_each.h"
|
#include "tbb/parallel_for_each.h"
|
||||||
|
#include "tbb/parallel_reduce.h"
|
||||||
#include "tbb/spin_mutex.h"
|
#include "tbb/spin_mutex.h"
|
||||||
#include "tbb/task_group.h"
|
#include "tbb/task_group.h"
|
||||||
|
|
||||||
@ -193,16 +194,30 @@ inline std::string toString(Symbol sym) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// input_chunks.cc
|
// input_sections.cc
|
||||||
//
|
//
|
||||||
|
|
||||||
|
struct ScanRelResult {
|
||||||
|
ScanRelResult add(const ScanRelResult &other) const {
|
||||||
|
return {num_got + other.num_got,
|
||||||
|
num_gotplt + other.num_gotplt,
|
||||||
|
num_plt + other.num_plt,
|
||||||
|
num_relplt + other.num_relplt};
|
||||||
|
}
|
||||||
|
|
||||||
|
u32 num_got = 0;
|
||||||
|
u32 num_gotplt = 0;
|
||||||
|
u32 num_plt = 0;
|
||||||
|
u32 num_relplt = 0;
|
||||||
|
};
|
||||||
|
|
||||||
class InputSection {
|
class InputSection {
|
||||||
public:
|
public:
|
||||||
InputSection(ObjectFile *file, const ELF64LE::Shdr &shdr, StringRef name);
|
InputSection(ObjectFile *file, const ELF64LE::Shdr &shdr, StringRef name);
|
||||||
|
|
||||||
void copy_to(u8 *buf);
|
void copy_to(u8 *buf);
|
||||||
void relocate(u8 *buf);
|
void relocate(u8 *buf);
|
||||||
void scan_relocations();
|
ScanRelResult scan_relocations();
|
||||||
|
|
||||||
ObjectFile *file;
|
ObjectFile *file;
|
||||||
OutputSection *output_section;
|
OutputSection *output_section;
|
||||||
@ -498,6 +513,7 @@ public:
|
|||||||
void hanlde_undefined_weak_symbols();
|
void hanlde_undefined_weak_symbols();
|
||||||
void eliminate_duplicate_comdat_groups();
|
void eliminate_duplicate_comdat_groups();
|
||||||
void convert_common_symbols();
|
void convert_common_symbols();
|
||||||
|
ScanRelResult scan_relocations();
|
||||||
void fix_sym_addrs();
|
void fix_sym_addrs();
|
||||||
void compute_symtab();
|
void compute_symtab();
|
||||||
|
|
||||||
@ -522,13 +538,6 @@ public:
|
|||||||
u64 global_symtab_size = 0;
|
u64 global_symtab_size = 0;
|
||||||
u64 global_strtab_size = 0;
|
u64 global_strtab_size = 0;
|
||||||
|
|
||||||
// Number of .got, .got.plt, .plt and .rel.plt entries
|
|
||||||
// needed for this file.
|
|
||||||
i32 num_got = 0;
|
|
||||||
i32 num_gotplt = 0;
|
|
||||||
i32 num_plt = 0;
|
|
||||||
i32 num_relplt = 0;
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void initialize_sections();
|
void initialize_sections();
|
||||||
void initialize_symbols();
|
void initialize_symbols();
|
||||||
|
@ -401,6 +401,14 @@ void ObjectFile::convert_common_symbols() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ScanRelResult ObjectFile::scan_relocations() {
|
||||||
|
ScanRelResult res;
|
||||||
|
for (InputSection *isec : sections)
|
||||||
|
if (isec)
|
||||||
|
res = res.add(isec->scan_relocations());
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
void ObjectFile::fix_sym_addrs() {
|
void ObjectFile::fix_sym_addrs() {
|
||||||
for (Symbol *sym : symbols) {
|
for (Symbol *sym : symbols) {
|
||||||
if (sym->file != this)
|
if (sym->file != this)
|
||||||
|
Loading…
Reference in New Issue
Block a user