mirror of
https://github.com/rui314/mold.git
synced 2024-09-22 10:27:48 +03:00
temporary
This commit is contained in:
parent
6bc9135bfd
commit
619f12a975
43
elf.cc
43
elf.cc
@ -35,3 +35,46 @@ std::string_view ElfFile::get_string(u32 idx) const {
|
||||
error(mb.name + ": invalid section index");
|
||||
return get_string(sections[idx]);
|
||||
}
|
||||
|
||||
struct ArHdr {
|
||||
std::string get_name() const {
|
||||
std::string_view view(ar_name);
|
||||
return std::string(view.substr(0, view.find(' ')));
|
||||
}
|
||||
|
||||
u32 get_size() const {
|
||||
u32 sz = 0;
|
||||
for (char c : ar_size)
|
||||
if (isdigit(c))
|
||||
sz = sz * 10 + c - '0';
|
||||
return sz;
|
||||
}
|
||||
|
||||
char ar_name[16];
|
||||
char ar_date[12];
|
||||
char ar_uid[6];
|
||||
char ar_gid[6];
|
||||
char ar_mode[8];
|
||||
char ar_size[10];
|
||||
char ar_fmag[2];
|
||||
};
|
||||
|
||||
std::vector<MemoryMappedFile> read_archive_members(MemoryMappedFile mb) {
|
||||
if (mb.size < 8 || memcmp(mb.data, "!<arch>\n", 8))
|
||||
error(mb.name + ": not an archive file");
|
||||
u8 *data = mb.data + 8;
|
||||
|
||||
std::vector<MemoryMappedFile> vec;
|
||||
|
||||
while (data < mb.data + mb.size) {
|
||||
ArHdr &hdr = *(ArHdr *)data;
|
||||
data += sizeof(ArHdr);
|
||||
|
||||
std::string name = hdr.get_name();
|
||||
u32 size = hdr.get_size();
|
||||
if (name != "/" && name != "//" && name != "__.SYMDEF")
|
||||
vec.push_back({name, data, size});
|
||||
data += size;
|
||||
}
|
||||
return vec;
|
||||
}
|
||||
|
4
main.cc
4
main.cc
@ -146,8 +146,8 @@ MemoryMappedFile must_open_input_file(std::string path) {
|
||||
void read_file(MemoryMappedFile mb) {
|
||||
switch (identify_magic({(char *)mb.data, mb.size})) {
|
||||
case file_magic::archive:
|
||||
for (MemoryMappedFile member : get_archive_members(mb))
|
||||
out::objs.push_back(new ObjectFile(member, mb.name));
|
||||
for (MemoryMappedFile &child : read_archive_members(mb))
|
||||
out::objs.push_back(new ObjectFile(child, mb.name));
|
||||
break;
|
||||
case file_magic::elf_relocatable:
|
||||
out::objs.push_back(new ObjectFile(mb, ""));
|
||||
|
Loading…
Reference in New Issue
Block a user