| ... | @@ -373,6 +373,62 @@ pub fn writeEhFrame(elf_file: *Elf, writer: anytype) !void { | ... | @@ -373,6 +373,62 @@ pub fn writeEhFrame(elf_file: *Elf, writer: anytype) !void { |
| 373 | try writer.writeInt(u32, 0, .little); | 373 | try writer.writeInt(u32, 0, .little); |
| 374 | } | 374 | } |
| 375 | | 375 | |
| | 376 | fn emitReloc(elf_file: *Elf, rec: anytype, sym: *const Symbol, rel: elf.Elf64_Rela) elf.Elf64_Rela { |
| | 377 | const r_offset = rec.address(elf_file) + rel.r_offset - rec.offset; |
| | 378 | const r_type = rel.r_type(); |
| | 379 | var r_addend = rel.r_addend; |
| | 380 | var r_sym: u32 = 0; |
| | 381 | switch (sym.type(elf_file)) { |
| | 382 | elf.STT_SECTION => { |
| | 383 | r_addend += @intCast(sym.value); |
| | 384 | r_sym = elf_file.sectionSymbolOutputSymtabIndex(sym.outputShndx().?); |
| | 385 | }, |
| | 386 | else => { |
| | 387 | r_sym = sym.outputSymtabIndex(elf_file) orelse 0; |
| | 388 | }, |
| | 389 | } |
| | 390 | |
| | 391 | relocs_log.debug(" {s}: [{x} => {d}({s})] + {x}", .{ |
| | 392 | Atom.fmtRelocType(r_type), |
| | 393 | r_offset, |
| | 394 | r_sym, |
| | 395 | sym.name(elf_file), |
| | 396 | r_addend, |
| | 397 | }); |
| | 398 | |
| | 399 | return .{ |
| | 400 | .r_offset = r_offset, |
| | 401 | .r_addend = r_addend, |
| | 402 | .r_info = (@as(u64, @intCast(r_sym)) << 32) | r_type, |
| | 403 | }; |
| | 404 | } |
| | 405 | |
| | 406 | pub fn writeEhFrameRelocs(elf_file: *Elf, writer: anytype) !void { |
| | 407 | relocs_log.debug("{x}: .eh_frame", .{elf_file.shdrs.items[elf_file.eh_frame_section_index.?].sh_addr}); |
| | 408 | |
| | 409 | for (elf_file.objects.items) |index| { |
| | 410 | const object = elf_file.file(index).?.object; |
| | 411 | |
| | 412 | for (object.cies.items) |cie| { |
| | 413 | if (!cie.alive) continue; |
| | 414 | for (cie.relocs(elf_file)) |rel| { |
| | 415 | const sym = elf_file.symbol(object.symbols.items[rel.r_sym()]); |
| | 416 | const out_rel = emitReloc(elf_file, cie, sym, rel); |
| | 417 | try writer.writeStruct(out_rel); |
| | 418 | } |
| | 419 | } |
| | 420 | |
| | 421 | for (object.fdes.items) |fde| { |
| | 422 | if (!fde.alive) continue; |
| | 423 | for (fde.relocs(elf_file)) |rel| { |
| | 424 | const sym = elf_file.symbol(object.symbols.items[rel.r_sym()]); |
| | 425 | const out_rel = emitReloc(elf_file, fde, sym, rel); |
| | 426 | try writer.writeStruct(out_rel); |
| | 427 | } |
| | 428 | } |
| | 429 | } |
| | 430 | } |
| | 431 | |
| 376 | pub fn writeEhFrameHdr(elf_file: *Elf, writer: anytype) !void { | 432 | pub fn writeEhFrameHdr(elf_file: *Elf, writer: anytype) !void { |
| 377 | try writer.writeByte(1); // version | 433 | try writer.writeByte(1); // version |
| 378 | try writer.writeByte(EH_PE.pcrel | EH_PE.sdata4); | 434 | try writer.writeByte(EH_PE.pcrel | EH_PE.sdata4); |