| ... | ... | @@ -1881,14 +1881,22 @@ const riscv = struct { |
| 1881 | 1881 | => { |
| 1882 | 1882 | assert(A == 0); // according to the spec |
| 1883 | 1883 | // We need to find the paired reloc for this relocation. |
| 1884 | | // TODO: should we search forward too? |
| 1885 | 1884 | const file_ptr = atom.file(elf_file).?; |
| 1885 | const atom_addr = atom.address(elf_file); |
| 1886 | 1886 | const pos = it.pos; |
| 1887 | 1887 | const pair = while (it.prev()) |pair| { |
| 1888 | | if (target.address(.{}, elf_file) == atom.address(elf_file) + pair.r_offset) { |
| 1889 | | break pair; |
| 1890 | | } |
| 1891 | | } else unreachable; // TODO error |
| 1888 | if (S == atom_addr + pair.r_offset) break pair; |
| 1889 | } else { |
| 1890 | // TODO: implement searching forward |
| 1891 | var err = try elf_file.addErrorWithNotes(1); |
| 1892 | try err.addMsg(elf_file, "TODO: find HI20 paired reloc scanning forward", .{}); |
| 1893 | try err.addNote(elf_file, "in {}:{s} at offset 0x{x}", .{ |
| 1894 | atom.file(elf_file).?.fmtPath(), |
| 1895 | atom.name(elf_file), |
| 1896 | rel.r_offset, |
| 1897 | }); |
| 1898 | return error.RelocFailure; |
| 1899 | }; |
| 1892 | 1900 | it.pos = pos; |
| 1893 | 1901 | const target_ = switch (file_ptr) { |
| 1894 | 1902 | .zig_object => |x| elf_file.symbol(x.symbol(pair.r_sym())), |
| ... | ... | @@ -1897,7 +1905,7 @@ const riscv = struct { |
| 1897 | 1905 | }; |
| 1898 | 1906 | const S_ = @as(i64, @intCast(target_.address(.{}, elf_file))); |
| 1899 | 1907 | const A_ = pair.r_addend; |
| 1900 | | const P_ = @as(i64, @intCast(atom.address(elf_file) + pair.r_offset)); |
| 1908 | const P_ = @as(i64, @intCast(atom_addr + pair.r_offset)); |
| 1901 | 1909 | const G_ = @as(i64, @intCast(target_.gotAddress(elf_file))) - GOT; |
| 1902 | 1910 | const disp = switch (@as(elf.R_RISCV, @enumFromInt(pair.r_type()))) { |
| 1903 | 1911 | .PCREL_HI20 => math.cast(i32, S_ + A_ - P_) orelse return error.Overflow, |