authorgravatar for 28024277+tjog@users.noreply.github.comtjog <28024277+tjog@users.noreply.github.com> 2025-04-21 17:44:31+02:00
committergravatar for alex@alexrp.comAlex Rønne Petersen <alex@alexrp.com> 2025-04-26 15:07:21+02:00
log3ca0f18bfe2e8a47c38b05fffea97146476e938c
tree14a8898c20d18e157f45b8357c50b2388755fa4a
parenta8844ab3bc18762026bd2ff7b7085e0abb6fdf36
signaturebadge-check Signed by SSH key SHA256:7B/LJ7bpR1eX8aCXSr4mtd5M45VMPKcx9zY8e95b5QM

fuzz: fix expected section start/end symbol name on MacOS when linking libfuzzer

Not only is the section name when adding the sancov variables different. The linker symbol ending up in the binary is also different. Reference: https://github.com/llvm/llvm-project/blob/60105ac6bab130c2694fc7f5b7b6a5fddaaab752/llvm/lib/Transforms/Instrumentation/SanitizerCoverage.cpp#L1076-L1104

1 files changed, 23 insertions(+), 8 deletions(-)

lib/fuzzer.zig+23-8
...@@ -468,27 +468,42 @@ export fn fuzzer_init(cache_dir_struct: Fuzzer.Slice) void {...@@ -468,27 +468,42 @@ export fn fuzzer_init(cache_dir_struct: Fuzzer.Slice) void {
468 // Linkers are expected to automatically add `__start_<section>` and468 // Linkers are expected to automatically add `__start_<section>` and
469 // `__stop_<section>` symbols when section names are valid C identifiers.469 // `__stop_<section>` symbols when section names are valid C identifiers.
470470
471 const ofmt = builtin.object_format;
472
473 const start_symbol_prefix: []const u8 = if (ofmt == .macho)
474 "\x01section$start$__DATA$__"
475 else
476 "__start___";
477 const end_symbol_prefix: []const u8 = if (ofmt == .macho)
478 "\x01section$end$__DATA$__"
479 else
480 "__end___";
481
482 const pc_counters_start_name = start_symbol_prefix ++ "sancov_cntrs";
471 const pc_counters_start = @extern([*]u8, .{483 const pc_counters_start = @extern([*]u8, .{
472 .name = "__start___sancov_cntrs",484 .name = pc_counters_start_name,
473 .linkage = .weak,485 .linkage = .weak,
474 }) orelse fatal("missing __start___sancov_cntrs symbol", .{});486 }) orelse fatal("missing {s} symbol", .{pc_counters_start_name});
475487
488 const pc_counters_end_name = end_symbol_prefix ++ "sancov_cntrs";
476 const pc_counters_end = @extern([*]u8, .{489 const pc_counters_end = @extern([*]u8, .{
477 .name = "__stop___sancov_cntrs",490 .name = pc_counters_end_name,
478 .linkage = .weak,491 .linkage = .weak,
479 }) orelse fatal("missing __stop___sancov_cntrs symbol", .{});492 }) orelse fatal("missing {s} symbol", .{pc_counters_end_name});
480493
481 const pc_counters = pc_counters_start[0 .. pc_counters_end - pc_counters_start];494 const pc_counters = pc_counters_start[0 .. pc_counters_end - pc_counters_start];
482495
496 const pcs_start_name = start_symbol_prefix ++ "sancov_pcs1";
483 const pcs_start = @extern([*]usize, .{497 const pcs_start = @extern([*]usize, .{
484 .name = "__start___sancov_pcs1",498 .name = pcs_start_name,
485 .linkage = .weak,499 .linkage = .weak,
486 }) orelse fatal("missing __start___sancov_pcs1 symbol", .{});500 }) orelse fatal("missing {s} symbol", .{pcs_start_name});
487501
502 const pcs_end_name = end_symbol_prefix ++ "sancov_pcs1";
488 const pcs_end = @extern([*]usize, .{503 const pcs_end = @extern([*]usize, .{
489 .name = "__stop___sancov_pcs1",504 .name = pcs_end_name,
490 .linkage = .weak,505 .linkage = .weak,
491 }) orelse fatal("missing __stop___sancov_pcs1 symbol", .{});506 }) orelse fatal("missing {s} symbol", .{pcs_end_name});
492507
493 const pcs = pcs_start[0 .. pcs_end - pcs_start];508 const pcs = pcs_start[0 .. pcs_end - pcs_start];
494509