Skip to content

Commit 2e35fdd

Browse files
tjogalexrp
authored andcommitted
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 parent 69007f0 commit 2e35fdd

File tree

1 file changed

+23
-8
lines changed

1 file changed

+23
-8
lines changed

lib/fuzzer.zig

+23-8
Original file line numberDiff line numberDiff line change
@@ -468,27 +468,42 @@ export fn fuzzer_init(cache_dir_struct: Fuzzer.Slice) void {
468468
// Linkers are expected to automatically add `__start_<section>` and
469469
// `__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";
471483
const pc_counters_start = @extern([*]u8, .{
472-
.name = "__start___sancov_cntrs",
484+
.name = pc_counters_start_name,
473485
.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";
476489
const pc_counters_end = @extern([*]u8, .{
477-
.name = "__stop___sancov_cntrs",
490+
.name = pc_counters_end_name,
478491
.linkage = .weak,
479-
}) orelse fatal("missing __stop___sancov_cntrs symbol", .{});
492+
}) orelse fatal("missing {s} symbol", .{pc_counters_end_name});
480493

481494
const pc_counters = pc_counters_start[0 .. pc_counters_end - pc_counters_start];
482495

496+
const pcs_start_name = start_symbol_prefix ++ "sancov_pcs1";
483497
const pcs_start = @extern([*]usize, .{
484-
.name = "__start___sancov_pcs1",
498+
.name = pcs_start_name,
485499
.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";
488503
const pcs_end = @extern([*]usize, .{
489-
.name = "__stop___sancov_pcs1",
504+
.name = pcs_end_name,
490505
.linkage = .weak,
491-
}) orelse fatal("missing __stop___sancov_pcs1 symbol", .{});
506+
}) orelse fatal("missing {s} symbol", .{pcs_end_name});
492507

493508
const pcs = pcs_start[0 .. pcs_end - pcs_start];
494509

0 commit comments

Comments
 (0)