authorgravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2023-11-09 18:49:19+01:00
committergravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2023-11-09 18:49:19+01:00
log27970bab0739232ff7331887f16ec1ee9bc8a9eb
tree4a0dcf7c0fdb8e9c7b838e1f0e31f8d48a2d1839
parent03c3a85ea36d8d6a18437b8d9c8a5fc714e4a81e

elf: format shdr flags when dumping state


1 files changed, 58 insertions(+), 2 deletions(-)

src/link/Elf.zig+58-2
...@@ -6124,13 +6124,69 @@ fn formatShdr(...@@ -6124,13 +6124,69 @@ fn formatShdr(
6124 _ = options;6124 _ = options;
6125 _ = unused_fmt_string;6125 _ = unused_fmt_string;
6126 const shdr = ctx.shdr;6126 const shdr = ctx.shdr;
6127 try writer.print("{s} : @{x} ({x}) : align({x}) : size({x})", .{6127 try writer.print("{s} : @{x} ({x}) : align({x}) : size({x}) : flags({})", .{
6128 ctx.elf_file.getShString(shdr.sh_name), shdr.sh_offset,6128 ctx.elf_file.getShString(shdr.sh_name), shdr.sh_offset,
6129 shdr.sh_addr, shdr.sh_addralign,6129 shdr.sh_addr, shdr.sh_addralign,
6130 shdr.sh_size,6130 shdr.sh_size, fmtShdrFlags(shdr.sh_flags),
6131 });6131 });
6132}6132}
61336133
6134fn fmtShdrFlags(sh_flags: u64) std.fmt.Formatter(formatShdrFlags) {
6135 return .{ .data = sh_flags };
6136}
6137
6138fn formatShdrFlags(
6139 sh_flags: u64,
6140 comptime unused_fmt_string: []const u8,
6141 options: std.fmt.FormatOptions,
6142 writer: anytype,
6143) !void {
6144 _ = unused_fmt_string;
6145 _ = options;
6146 if (elf.SHF_WRITE & sh_flags != 0) {
6147 try writer.writeAll("W");
6148 }
6149 if (elf.SHF_ALLOC & sh_flags != 0) {
6150 try writer.writeAll("A");
6151 }
6152 if (elf.SHF_EXECINSTR & sh_flags != 0) {
6153 try writer.writeAll("X");
6154 }
6155 if (elf.SHF_MERGE & sh_flags != 0) {
6156 try writer.writeAll("M");
6157 }
6158 if (elf.SHF_STRINGS & sh_flags != 0) {
6159 try writer.writeAll("S");
6160 }
6161 if (elf.SHF_INFO_LINK & sh_flags != 0) {
6162 try writer.writeAll("I");
6163 }
6164 if (elf.SHF_LINK_ORDER & sh_flags != 0) {
6165 try writer.writeAll("L");
6166 }
6167 if (elf.SHF_EXCLUDE & sh_flags != 0) {
6168 try writer.writeAll("E");
6169 }
6170 if (elf.SHF_COMPRESSED & sh_flags != 0) {
6171 try writer.writeAll("C");
6172 }
6173 if (elf.SHF_GROUP & sh_flags != 0) {
6174 try writer.writeAll("G");
6175 }
6176 if (elf.SHF_OS_NONCONFORMING & sh_flags != 0) {
6177 try writer.writeAll("O");
6178 }
6179 if (elf.SHF_TLS & sh_flags != 0) {
6180 try writer.writeAll("T");
6181 }
6182 if (elf.SHF_X86_64_LARGE & sh_flags != 0) {
6183 try writer.writeAll("l");
6184 }
6185 if (elf.SHF_MIPS_ADDR & sh_flags != 0 or elf.SHF_ARM_PURECODE & sh_flags != 0) {
6186 try writer.writeAll("p");
6187 }
6188}
6189
6134const FormatPhdrCtx = struct {6190const FormatPhdrCtx = struct {
6135 elf_file: *Elf,6191 elf_file: *Elf,
6136 phdr: elf.Elf64_Phdr,6192 phdr: elf.Elf64_Phdr,