[PATCH] D107374: [libFuzzer] replace Vector/Set with std::vector/std::set. The custom names are not required any more since we now build with a private version of libc++. Fix some of the 81+ character lines. Mechanical change, NFC expected.
David Spickett via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Tue Aug 10 07:28:24 PDT 2021
DavidSpickett added subscribers: MaskRay, DavidSpickett.
DavidSpickett added a comment.
Bear with me, this report is a bit strange but I'm sure we can find a good explanation for it. The code looks fine, I think it has uncovered something else.
Since this commit, our 2 stage aarch64 bots have been failing on one particular test:
https://lab.llvm.org/buildbot/#/builders/185/builds/260
I haven't seen this on any other bots. The odd thing is that stage 1, which we build with clang-12, is fine.
The error itself is:
/tmp/FlagsTest-19213f.o: In function `sancov.module_ctor_8bit_counters':
FlagsTest.cpp:(.text.sancov.module_ctor_8bit_counters[sancov.module_ctor_8bit_counters]+0x14): undefined reference to `__start___sancov_cntrs'
FlagsTest.cpp:(.text.sancov.module_ctor_8bit_counters[sancov.module_ctor_8bit_counters]+0x18): undefined reference to `__stop___sancov_cntrs'
<...>
I looked at the IR for the test file and it was identical with this commit reverted. (which makes a lot of sense but just for sanity) I saw that these `_sancov_cntrs` etc. are defined in the IR. (I thought they might be in the fuzzer lib instead for example)
So the weird thing is, why doesn't the linker just find the definitions inside the file?
If I add `-c` to the command lit runs, and examine the pre-link objects:
$ objdump -h /tmp/not_working | grep sancov
18 .text.sancov.module_ctor_8bit_counters 00000048 0000000000000000 0000000000000000 00002bb8 2**2
23 __sancov_cntrs 00000008 0000000000000000 0000000000000000 00002e08 2**0
24 __sancov_pcs 00000080 0000000000000000 0000000000000000 00002e10 2**3
25 __sancov_cntrs 0000002d 0000000000000000 0000000000000000 00002e90 2**0
26 __sancov_pcs 000002d0 0000000000000000 0000000000000000 00002ec0 2**3
27 __sancov_cntrs 0000000a 0000000000000000 0000000000000000 00003190 2**0
28 __sancov_pcs 000000a0 0000000000000000 0000000000000000 000031a0 2**3
29 __sancov_cntrs 0000001e 0000000000000000 0000000000000000 00003240 2**0
30 __sancov_pcs 000001e0 0000000000000000 0000000000000000 00003260 2**3
31 __sancov_cntrs 0000001a 0000000000000000 0000000000000000 00003440 2**0
32 __sancov_pcs 000001a0 0000000000000000 0000000000000000 00003460 2**3
33 __sancov_cntrs 00000001 0000000000000000 0000000000000000 00003600 2**0
34 __sancov_pcs 00000010 0000000000000000 0000000000000000 00003608 2**3
$ objdump -h /tmp/working | grep sancov
14 __sancov_pcs 00000780 0000000000520340 0000000000520340 00120340 2**3
27 __sancov_cntrs 00000078 00000000005520d0 00000000005520d0 001420d0 2**0
It seems that `module_ctor_8bit_counters` in the working object has been placed into the `.text` section. Where in the not working object it's got its own section, plus we have way more `__sancov_...`. (whether that's a good thing or not)
Our buildbot is using lld, I tried this using ld as well and got the same results. So I'm assuming that it's not both linkers mishandling the same input, but something before that going wrong. (which would be why clang-12 stage 1 was fine but clang-14 stage 2 was not)
If we look at the symbols:
$ nm /tmp/not_working | grep sancov
U __sancov_lowest_stack
w __start___sancov_cntrs
w __start___sancov_pcs
w __stop___sancov_cntrs
w __stop___sancov_pcs
0000000000000000 t sancov.module_ctor_8bit_counters
$ nm /tmp/working | grep sancov
00000000004f08a0 T _ZN8__sancov11SancovFlags11SetDefaultsEv
00000000004f10d0 t _ZN8__sancov12_GLOBAL__N_119WriteModuleCoverageEPcPKcPKmm
00000000006ec278 b _ZN8__sancov12_GLOBAL__N_119pc_guard_controllerE
000000000051c768 r _ZN8__sancov12_GLOBAL__N_15MagicE
00000000004f08b0 T _ZN8__sancov21InitializeSancovFlagsEv
00000000006ec270 B _ZN8__sancov30sancov_flags_dont_use_directlyE
0000000000452410 W _ZTW21__sancov_lowest_stack
00000000004f0890 W __sancov_default_options
0000000000000008 B __sancov_lowest_stack
00000000005520d0 D __start___sancov_cntrs
0000000000520340 R __start___sancov_pcs
0000000000552148 D __stop___sancov_cntrs
0000000000520ac0 R __stop___sancov_pcs
000000000050704c t sancov.module_ctor_8bit_counters
The working object has resolved the `_start__/_stop__` symbols before we go to the linker. I don't understand at the moment, how it does that and what might be going wrong in the failing case.
@MaskRay is this anything to do with https://reviews.llvm.org/D106246 ? (either way, you have been in this area do you have any pointers of how to investigate?)
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D107374/new/
https://reviews.llvm.org/D107374
More information about the llvm-commits
mailing list