| ... | @@ -282,6 +282,22 @@ pub fn calcEhFrameHdrSize(elf_file: *Elf) usize { | ... | @@ -282,6 +282,22 @@ pub fn calcEhFrameHdrSize(elf_file: *Elf) usize { |
| 282 | return eh_frame_hdr_header_size + count * 8; | 282 | return eh_frame_hdr_header_size + count * 8; |
| 283 | } | 283 | } |
| 284 | | 284 | |
| | 285 | pub fn calcEhFrameRelocs(elf_file: *Elf) usize { |
| | 286 | var count: usize = 0; |
| | 287 | for (elf_file.objects.items) |index| { |
| | 288 | const object = elf_file.file(index).?.object; |
| | 289 | for (object.cies.items) |cie| { |
| | 290 | if (!cie.alive) continue; |
| | 291 | count += cie.relocs(elf_file).len; |
| | 292 | } |
| | 293 | for (object.fdes.items) |fde| { |
| | 294 | if (!fde.alive) continue; |
| | 295 | count += fde.relocs(elf_file).len; |
| | 296 | } |
| | 297 | } |
| | 298 | return count; |
| | 299 | } |
| | 300 | |
| 285 | fn resolveReloc(rec: anytype, sym: *const Symbol, rel: elf.Elf64_Rela, elf_file: *Elf, contents: []u8) !void { | 301 | fn resolveReloc(rec: anytype, sym: *const Symbol, rel: elf.Elf64_Rela, elf_file: *Elf, contents: []u8) !void { |
| 286 | const offset = std.math.cast(usize, rel.r_offset - rec.offset) orelse return error.Overflow; | 302 | const offset = std.math.cast(usize, rel.r_offset - rec.offset) orelse return error.Overflow; |
| 287 | const P = @as(i64, @intCast(rec.address(elf_file) + offset)); | 303 | const P = @as(i64, @intCast(rec.address(elf_file) + offset)); |