diff --git a/CMakeLists.txt b/CMakeLists.txt index 9229f9a2..55780009 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -362,7 +362,6 @@ target_sources(mold PRIVATE lib/compress.cc lib/crc32.cc lib/demangle.cc - lib/elf.cc lib/filepath.cc lib/glob.cc lib/hyperloglog.cc @@ -384,6 +383,7 @@ target_sources(mold PRIVATE src/arch-sparc64.cc src/arch-x86-64.cc src/config.cc + src/elf.cc third-party/rust-demangle/rust-demangle.c ) diff --git a/lib/archive-file.h b/lib/archive-file.h index 11158f49..35a7775e 100644 --- a/lib/archive-file.h +++ b/lib/archive-file.h @@ -26,7 +26,6 @@ #pragma once #include "common.h" -#include "filetype.h" namespace mold { @@ -164,14 +163,11 @@ std::vector read_fat_archive_members(Context &ctx, MappedFile *mf) template std::vector read_archive_members(Context &ctx, MappedFile *mf) { - switch (get_file_type(ctx, mf)) { - case FileType::AR: + std::string_view str = mf->get_contents(); + if (str.starts_with("!\n")) return read_fat_archive_members(ctx, mf); - case FileType::THIN_AR: - return read_thin_archive_members(ctx, mf); - default: - unreachable(); - } + assert(str.starts_with("!\n")); + return read_thin_archive_members(ctx, mf); } } // namespace mold diff --git a/lib/integers.h b/lib/integers.h index 0b3092bb..11582f70 100644 --- a/lib/integers.h +++ b/lib/integers.h @@ -8,12 +8,12 @@ // big-endian SPARC machine to create a little-endian RV64 binary. // // 2. Even though data members in all ELF data strucutres are naturally -// aligned, they are not guaranteed to be aligned on memory. Because -// archive file (.a file) aligns each member only to a 2 byte boundary, -// anything larger than 2 bytes may be unaligned in an mmap'ed memory. -// Unaligned access is an undefined behavior in C/C++, so we shouldn't -// cast an arbitrary pointer to a uint32_t, for example, to read a -// 32 bit value. +// aligned, they are not guaranteed to be aligned on memory because of +// archive files. Archive files (.a files) align each member only to a +// 2 byte boundary, so anything larger than 2 bytes may be misaligned +// in an mmap'ed memory. Misaligned access is an undefined behavior in +// C/C++, so we shouldn't cast an arbitrary pointer to a uint32_t, for +// example, to read a 32 bit value. // // The data types defined in this file don't depend on host byte order and // don't do unaligned access. diff --git a/lib/tar.cc b/lib/tar.cc index 5c0692d4..30f464bc 100644 --- a/lib/tar.cc +++ b/lib/tar.cc @@ -1,3 +1,5 @@ +// This file contains functions to create a tar file. + #include "common.h" #ifdef _WIN32 diff --git a/lib/elf.cc b/src/elf.cc similarity index 100% rename from lib/elf.cc rename to src/elf.cc diff --git a/lib/elf.h b/src/elf.h similarity index 99% rename from lib/elf.h rename to src/elf.h index 04234e5f..0b208642 100644 --- a/lib/elf.h +++ b/src/elf.h @@ -1,6 +1,6 @@ #pragma once -#include "integers.h" +#include "../lib/integers.h" #include #include diff --git a/lib/filetype.h b/src/filetype.h similarity index 88% rename from lib/filetype.h rename to src/filetype.h index cfd74246..6b0e40ab 100644 --- a/lib/filetype.h +++ b/src/filetype.h @@ -1,6 +1,6 @@ #pragma once -#include "common.h" +#include "../lib/common.h" #include "elf.h" namespace mold { @@ -140,23 +140,23 @@ FileType get_file_type(Context &ctx, MappedFile *mf) { return FileType::UNKNOWN; } -inline std::string filetype_to_string(FileType type) { - switch (type) { - case FileType::UNKNOWN: return "UNKNOWN"; - case FileType::EMPTY: return "EMPTY"; - case FileType::ELF_OBJ: return "ELF_OBJ"; - case FileType::ELF_DSO: return "ELF_DSO"; - case FileType::AR: return "AR"; - case FileType::THIN_AR: return "THIN_AR"; - case FileType::TEXT: return "TEXT"; - case FileType::GCC_LTO_OBJ: return "GCC_LTO_OBJ"; - case FileType::LLVM_BITCODE: return "LLVM_BITCODE"; - } - return "UNKNOWN"; -} - inline std::ostream &operator<<(std::ostream &out, FileType type) { - out << filetype_to_string(type); + auto to_string = [&] { + switch (type) { + case FileType::UNKNOWN: return "UNKNOWN"; + case FileType::EMPTY: return "EMPTY"; + case FileType::ELF_OBJ: return "ELF_OBJ"; + case FileType::ELF_DSO: return "ELF_DSO"; + case FileType::AR: return "AR"; + case FileType::THIN_AR: return "THIN_AR"; + case FileType::TEXT: return "TEXT"; + case FileType::GCC_LTO_OBJ: return "GCC_LTO_OBJ"; + case FileType::LLVM_BITCODE: return "LLVM_BITCODE"; + default: return "UNKNOWN"; + } + }; + + out << to_string(); return out; } diff --git a/src/main.cc b/src/main.cc index 799016ca..4b0f2e5a 100644 --- a/src/main.cc +++ b/src/main.cc @@ -1,4 +1,5 @@ #include "mold.h" +#include "filetype.h" #include "../lib/archive-file.h" #include "../lib/output-file.h" diff --git a/src/mold.h b/src/mold.h index fbef659b..17d4732a 100644 --- a/src/mold.h +++ b/src/mold.h @@ -1,7 +1,7 @@ #pragma once #include "../lib/common.h" -#include "../lib/elf.h" +#include "elf.h" #include #include