commit 27970bab0739232ff7331887f16ec1ee9bc8a9eb (tree)
parent 03c3a85ea36d8d6a18437b8d9c8a5fc714e4a81e
Author: Jakub Konka <kubkon@jakubkonka.com>
Date: Thu, 9 Nov 2023 18:49:19 +0100
elf: format shdr flags when dumping state
Diffstat:
| M | src/link/Elf.zig | | | 60 | ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-- |
1 file changed, 58 insertions(+), 2 deletions(-)
diff --git 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,