When coverage is enabled on x86_64, GCC uses relative addressing to increment the gcov counters. The generated code of the test function assumes execution is in the same location where the linker places the test function. This does not work with the execution test as it copies the function into another part of memory and tries to execute from there. When the copied function starts to run, the instruction pointer is at the newly copied function. So any relative addressing with regard to the instruction pointer now is invalid. Instead of <generated code RIP + offset> for gcov counter as it should be, now the copied code is trying to access the counter at <copied code RIP + offset>, which points to incorrect memory location (and possibly invalid/non-mapped memory). To fix this, we need to tell GCC not to use relative addressing. This can be accomplished by telling GCC to use the large memory model. This is only used for this test as this option increases code size quite a bit, and should not be used in general. Fixes #30434 Signed-off-by: Daniel Leung <daniel.leung@intel.com> |
||
|---|---|---|
| .. | ||
| src | ||
| CMakeLists.txt | ||
| custom-sections.ld | ||
| prj_x86_64_coverage_exec.conf | ||
| prj.conf | ||
| testcase.yaml | ||