diff options
| author | Jakub Konka <kubkon@jakubkonka.com> | 2023-11-09 18:49:19 +0100 |
|---|---|---|
| committer | Jakub Konka <kubkon@jakubkonka.com> | 2023-11-09 18:49:19 +0100 |
| commit | 27970bab0739232ff7331887f16ec1ee9bc8a9eb (patch) | |
| tree | 4a0dcf7c0fdb8e9c7b838e1f0e31f8d48a2d1839 /src | |
| parent | 03c3a85ea36d8d6a18437b8d9c8a5fc714e4a81e (diff) | |
| download | zig-27970bab0739232ff7331887f16ec1ee9bc8a9eb.tar.gz zig-27970bab0739232ff7331887f16ec1ee9bc8a9eb.zip | |
elf: format shdr flags when dumping state
Diffstat (limited to 'src')
| -rw-r--r-- | src/link/Elf.zig | 60 |
1 files changed, 58 insertions, 2 deletions
diff --git a/src/link/Elf.zig b/src/link/Elf.zig index ce7f2fc40e..1cb6fc02b1 100644 --- a/src/link/Elf.zig +++ b/src/link/Elf.zig @@ -6124,13 +6124,69 @@ fn formatShdr( _ = options; _ = unused_fmt_string; const shdr = ctx.shdr; - try writer.print("{s} : @{x} ({x}) : align({x}) : size({x})", .{ + try writer.print("{s} : @{x} ({x}) : align({x}) : size({x}) : flags({})", .{ ctx.elf_file.getShString(shdr.sh_name), shdr.sh_offset, shdr.sh_addr, shdr.sh_addralign, - shdr.sh_size, + shdr.sh_size, fmtShdrFlags(shdr.sh_flags), }); } +fn fmtShdrFlags(sh_flags: u64) std.fmt.Formatter(formatShdrFlags) { + return .{ .data = sh_flags }; +} + +fn formatShdrFlags( + sh_flags: u64, + comptime unused_fmt_string: []const u8, + options: std.fmt.FormatOptions, + writer: anytype, +) !void { + _ = unused_fmt_string; + _ = options; + if (elf.SHF_WRITE & sh_flags != 0) { + try writer.writeAll("W"); + } + if (elf.SHF_ALLOC & sh_flags != 0) { + try writer.writeAll("A"); + } + if (elf.SHF_EXECINSTR & sh_flags != 0) { + try writer.writeAll("X"); + } + if (elf.SHF_MERGE & sh_flags != 0) { + try writer.writeAll("M"); + } + if (elf.SHF_STRINGS & sh_flags != 0) { + try writer.writeAll("S"); + } + if (elf.SHF_INFO_LINK & sh_flags != 0) { + try writer.writeAll("I"); + } + if (elf.SHF_LINK_ORDER & sh_flags != 0) { + try writer.writeAll("L"); + } + if (elf.SHF_EXCLUDE & sh_flags != 0) { + try writer.writeAll("E"); + } + if (elf.SHF_COMPRESSED & sh_flags != 0) { + try writer.writeAll("C"); + } + if (elf.SHF_GROUP & sh_flags != 0) { + try writer.writeAll("G"); + } + if (elf.SHF_OS_NONCONFORMING & sh_flags != 0) { + try writer.writeAll("O"); + } + if (elf.SHF_TLS & sh_flags != 0) { + try writer.writeAll("T"); + } + if (elf.SHF_X86_64_LARGE & sh_flags != 0) { + try writer.writeAll("l"); + } + if (elf.SHF_MIPS_ADDR & sh_flags != 0 or elf.SHF_ARM_PURECODE & sh_flags != 0) { + try writer.writeAll("p"); + } +} + const FormatPhdrCtx = struct { elf_file: *Elf, phdr: elf.Elf64_Phdr, |
