#include "mold.h" #include #include namespace mold::macho { struct Sym { u64 addr; u32 size; u32 fileidx; std::string_view name; }; void print_map(Context &ctx) { std::ofstream out(ctx.arg.map.c_str()); if (!out.is_open()) Fatal(ctx) << "cannot open " << ctx.arg.map << ": " << errno_string(); out << "# Path: " << ctx.arg.output << "\n" << "# Arch: x86-64\n" << "# Object files:\n"; std::vector syms; for (i64 i = 0; i < ctx.objs.size(); i++){ ObjectFile &file = *ctx.objs[i]; if (file.is_alive) { out << "[" << std::setw(3) << i << "] " << file << "\n"; for (Symbol *sym : file.syms) if (sym->file == &file) syms.push_back({sym->get_addr(ctx), 0, (u32)i, sym->name}); } } sort(syms, [](const Sym &a, const Sym &b) { return a.addr < b.addr; }); out << "# Sections:\n" << "# Address Size Segment Section\n"; for (std::unique_ptr &seg : ctx.segments) { for (Chunk *chunk : seg->chunks) { if (!chunk->is_hidden) { out << "0x" << std::hex << std::setw(8) << std::setfill('0') << chunk->hdr.addr << " 0x" << std::setw(8) << std::setfill('0') << chunk->hdr.size << " " << std::setw(7) << std::left << std::setfill(' ') << chunk->hdr.get_segname() << " " << chunk->hdr.get_sectname() << "\n"; } } } out << "# Symbols:\n" << "# Address Size File Name\n"; for (Sym &sym : syms) { out << "0x" << std::hex << std::setw(8) << std::setfill('0') << sym.addr << " 0x" << std::setw(8) << std::setfill('0') << 0 << " [" << std::setw(3) << std::right << std::setfill(' ') << sym.fileidx << "] " << sym.name << "\n"; } } } // namespace mold::macho