authorgravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2023-10-07 21:28:30+02:00
committergravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2023-10-16 19:33:05+02:00
log9861a9ea75f117ce236f62af8af22620c625a0f9
tree48b9d4e7a0acfb98ec56ab18a48847e7be7d56d6
parentb6006df565182648ee78bc847053b8cd5278b681

elf: test various copyrel edge cases


1 files changed, 149 insertions(+), 0 deletions(-)

test/link/elf.zig+149
......@@ -43,6 +43,9 @@ pub fn build(b: *Build) void {
4343
4444 elf_step.dependOn(testAsNeeded(b, .{ .target = glibc_target, .dynamic_linker = dynamic_linker }));
4545 elf_step.dependOn(testCanonicalPlt(b, .{ .target = glibc_target, .dynamic_linker = dynamic_linker }));
46 elf_step.dependOn(testCopyrel(b, .{ .target = glibc_target, .dynamic_linker = dynamic_linker }));
47 elf_step.dependOn(testCopyrelAlias(b, .{ .target = glibc_target, .dynamic_linker = dynamic_linker }));
48 elf_step.dependOn(testCopyrelAlignment(b, .{ .target = glibc_target, .dynamic_linker = dynamic_linker }));
4649 elf_step.dependOn(testDsoPlt(b, .{ .target = glibc_target, .dynamic_linker = dynamic_linker }));
4750 elf_step.dependOn(testDsoUndef(b, .{ .target = glibc_target, .dynamic_linker = dynamic_linker }));
4851 elf_step.dependOn(testLargeAlignmentDso(b, .{ .target = glibc_target, .dynamic_linker = dynamic_linker }));
......@@ -320,6 +323,152 @@ fn testCommonSymbolsInArchive(b: *Build, opts: Options) *Step {
320323 return test_step;
321324}
322325
326fn testCopyrel(b: *Build, opts: Options) *Step {
327 const test_step = addTestStep(b, "copyrel", opts);
328
329 const dso = addSharedLibrary(b, "a", opts);
330 addCSourceBytes(dso,
331 \\int foo = 3;
332 \\int bar = 5;
333 , &.{"-fPIC"});
334
335 const exe = addExecutable(b, "main", opts);
336 addCSourceBytes(exe,
337 \\#include<stdio.h>
338 \\extern int foo, bar;
339 \\int main() {
340 \\ printf("%d %d\n", foo, bar);
341 \\ return 0;
342 \\}
343 , &.{});
344 exe.linkLibrary(dso);
345 exe.linkLibC();
346
347 const run = addRunArtifact(exe);
348 run.expectStdOutEqual("3 5\n");
349 test_step.dependOn(&run.step);
350
351 return test_step;
352}
353
354fn testCopyrelAlias(b: *Build, opts: Options) *Step {
355 const test_step = addTestStep(b, "copyrel-alias", opts);
356
357 const dso = addSharedLibrary(b, "a", opts);
358 addCSourceBytes(dso,
359 \\int bruh = 31;
360 \\int foo = 42;
361 \\extern int bar __attribute__((alias("foo")));
362 \\extern int baz __attribute__((alias("foo")));
363 , &.{"-fPIC"});
364
365 const exe = addExecutable(b, "main", opts);
366 addCSourceBytes(exe,
367 \\#include<stdio.h>
368 \\extern int foo;
369 \\extern int *get_bar();
370 \\int main() {
371 \\ printf("%d %d %d\n", foo, *get_bar(), &foo == get_bar());
372 \\ return 0;
373 \\}
374 , &.{"-fno-PIC"});
375 addCSourceBytes(exe,
376 \\extern int bar;
377 \\int *get_bar() { return &bar; }
378 , &.{"-fno-PIC"});
379 exe.linkLibrary(dso);
380 exe.linkLibC();
381 exe.pie = false;
382
383 const run = addRunArtifact(exe);
384 run.expectStdOutEqual("42 42 1\n");
385 test_step.dependOn(&run.step);
386
387 return test_step;
388}
389
390fn testCopyrelAlignment(b: *Build, opts: Options) *Step {
391 const test_step = addTestStep(b, "copyrel-alignment", opts);
392
393 const a_so = addSharedLibrary(b, "a", opts);
394 addCSourceBytes(a_so, "__attribute__((aligned(32))) int foo = 5;", &.{"-fPIC"});
395
396 const b_so = addSharedLibrary(b, "b", opts);
397 addCSourceBytes(b_so, "__attribute__((aligned(8))) int foo = 5;", &.{"-fPIC"});
398
399 const c_so = addSharedLibrary(b, "c", opts);
400 addCSourceBytes(c_so, "__attribute__((aligned(256))) int foo = 5;", &.{"-fPIC"});
401
402 const obj = addObject(b, "main", opts);
403 addCSourceBytes(obj,
404 \\#include <stdio.h>
405 \\extern int foo;
406 \\int main() { printf("%d\n", foo); }
407 , &.{"-fno-PIE"});
408 obj.linkLibC();
409
410 const exp_stdout = "5\n";
411
412 {
413 const exe = addExecutable(b, "main", opts);
414 exe.addObject(obj);
415 exe.linkLibrary(a_so);
416 exe.linkLibC();
417 exe.pie = false;
418
419 const run = addRunArtifact(exe);
420 run.expectStdOutEqual(exp_stdout);
421 test_step.dependOn(&run.step);
422
423 const check = exe.checkObject();
424 check.checkStart();
425 check.checkExact("section headers");
426 check.checkExact("name .copyrel");
427 check.checkExact("addralign 20");
428 test_step.dependOn(&check.step);
429 }
430
431 {
432 const exe = addExecutable(b, "main", opts);
433 exe.addObject(obj);
434 exe.linkLibrary(b_so);
435 exe.linkLibC();
436 exe.pie = false;
437
438 const run = addRunArtifact(exe);
439 run.expectStdOutEqual(exp_stdout);
440 test_step.dependOn(&run.step);
441
442 const check = exe.checkObject();
443 check.checkStart();
444 check.checkExact("section headers");
445 check.checkExact("name .copyrel");
446 check.checkExact("addralign 8");
447 test_step.dependOn(&check.step);
448 }
449
450 {
451 const exe = addExecutable(b, "main", opts);
452 exe.addObject(obj);
453 exe.linkLibrary(c_so);
454 exe.linkLibC();
455 exe.pie = false;
456
457 const run = addRunArtifact(exe);
458 run.expectStdOutEqual(exp_stdout);
459 test_step.dependOn(&run.step);
460
461 const check = exe.checkObject();
462 check.checkStart();
463 check.checkExact("section headers");
464 check.checkExact("name .copyrel");
465 check.checkExact("addralign 100");
466 test_step.dependOn(&check.step);
467 }
468
469 return test_step;
470}
471
323472fn testDsoPlt(b: *Build, opts: Options) *Step {
324473 const test_step = addTestStep(b, "dso-plt", opts);
325474