diff options
| -rw-r--r-- | src/link/Elf/thunks.zig | 6 | ||||
| -rw-r--r-- | test/link/elf.zig | 76 |
2 files changed, 51 insertions, 31 deletions
diff --git a/src/link/Elf/thunks.zig b/src/link/Elf/thunks.zig index 586cbed236..119529b512 100644 --- a/src/link/Elf/thunks.zig +++ b/src/link/Elf/thunks.zig @@ -1,6 +1,7 @@ pub fn createThunks(shndx: u32, elf_file: *Elf) !void { const gpa = elf_file.base.comp.gpa; const cpu_arch = elf_file.getTarget().cpu.arch; + const max_distance = maxAllowedDistance(cpu_arch); const shdr = &elf_file.shdrs.items[shndx]; const atoms = elf_file.output_sections.get(shndx).?.items; assert(atoms.len > 0); @@ -17,12 +18,11 @@ pub fn createThunks(shndx: u32, elf_file: *Elf) !void { start_atom.value = try advance(shdr, start_atom.size, start_atom.alignment); i += 1; - while (i < atoms.len and - shdr.sh_size - start_atom.value < maxAllowedDistance(cpu_arch)) : (i += 1) - { + while (i < atoms.len) : (i += 1) { const atom_index = atoms[i]; const atom = elf_file.atom(atom_index).?; assert(atom.flags.alive); + if (atom.alignment.forward(shdr.sh_size) - start_atom.value >= max_distance) break; atom.value = try advance(shdr, atom.size, atom.alignment); } diff --git a/test/link/elf.zig b/test/link/elf.zig index 1920feb30c..fd6af3160f 100644 --- a/test/link/elf.zig +++ b/test/link/elf.zig @@ -2671,36 +2671,56 @@ fn testStrip(b: *Build, opts: Options) *Step { fn testThunks(b: *Build, opts: Options) *Step { const test_step = addTestStep(b, "thunks", opts); - const exe = addExecutable(b, opts, .{ .name = "main", .c_source_bytes = - \\#include <stdio.h> - \\__attribute__((aligned(0x8000000))) int bar() { - \\ return 42; - \\} - \\int foobar(); - \\int foo() { - \\ return bar() - foobar(); - \\} - \\__attribute__((aligned(0x8000000))) int foobar() { - \\ return 42; - \\} - \\int main() { - \\ printf("bar=%d, foo=%d, foobar=%d", bar(), foo(), foobar()); - \\ return foo(); - \\} - }); - exe.link_function_sections = true; - exe.linkLibC(); + const src = + \\#include <stdio.h> + \\__attribute__((aligned(0x8000000))) int bar() { + \\ return 42; + \\} + \\int foobar(); + \\int foo() { + \\ return bar() - foobar(); + \\} + \\__attribute__((aligned(0x8000000))) int foobar() { + \\ return 42; + \\} + \\int main() { + \\ printf("bar=%d, foo=%d, foobar=%d", bar(), foo(), foobar()); + \\ return foo(); + \\} + ; - const run = addRunArtifact(exe); - run.expectStdOutEqual("bar=42, foo=0, foobar=42"); - run.expectExitCode(0); - test_step.dependOn(&run.step); + { + const exe = addExecutable(b, opts, .{ .name = "main", .c_source_bytes = src }); + exe.link_function_sections = true; + exe.linkLibC(); - const check = exe.checkObject(); - check.max_bytes = std.math.maxInt(u32); - check.checkInSymtab(); - check.checkContains("_libc_start_main$thunk"); - test_step.dependOn(&check.step); + const run = addRunArtifact(exe); + run.expectStdOutEqual("bar=42, foo=0, foobar=42"); + run.expectExitCode(0); + test_step.dependOn(&run.step); + + const check = exe.checkObject(); + check.max_bytes = std.math.maxInt(u32); + check.checkInSymtab(); + check.checkContains("__libc_start_main$thunk"); + test_step.dependOn(&check.step); + } + + { + const exe = addExecutable(b, opts, .{ .name = "main2", .c_source_bytes = src }); + exe.linkLibC(); + + const run = addRunArtifact(exe); + run.expectStdOutEqual("bar=42, foo=0, foobar=42"); + run.expectExitCode(0); + test_step.dependOn(&run.step); + + const check = exe.checkObject(); + check.max_bytes = std.math.maxInt(u32); + check.checkInSymtab(); + check.checkContains("__libc_start_main$thunk"); + test_step.dependOn(&check.step); + } return test_step; } |
