Skip to content

Commit d312d69

Browse files
authored
[DeviceASAN] Fix incorrect symbolizer output for shared libraries (#2229)
1 parent ce8a8e0 commit d312d69

File tree

2 files changed

+31
-5
lines changed

2 files changed

+31
-5
lines changed

source/loader/layers/sanitizer/linux/symbolizer.cpp

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,10 @@
77
* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
88
*
99
*/
10+
#include "common.hpp"
1011
#include "llvm/DebugInfo/Symbolize/DIPrinter.h"
1112
#include "llvm/DebugInfo/Symbolize/Symbolize.h"
13+
#include <link.h>
1214

1315
static llvm::symbolize::PrinterConfig GetPrinterConfig() {
1416
llvm::symbolize::PrinterConfig Config;
@@ -20,6 +22,28 @@ static llvm::symbolize::PrinterConfig GetPrinterConfig() {
2022
return Config;
2123
}
2224

25+
static uintptr_t GetModuleBase(const char *ModuleName) {
26+
uintptr_t Data = (uintptr_t)ModuleName;
27+
int Result = dl_iterate_phdr(
28+
[](struct dl_phdr_info *Info, size_t, void *Arg) {
29+
uintptr_t *Data = (uintptr_t *)Arg;
30+
const char *ModuleName = (const char *)(*Data);
31+
if (strstr(Info->dlpi_name, ModuleName)) {
32+
*Data = (uintptr_t)Info->dlpi_addr;
33+
return 1;
34+
}
35+
return 0;
36+
},
37+
(void *)&Data);
38+
39+
// If dl_iterate_phdr return 0, it means the module is main executable,
40+
// its base address should be 0.
41+
if (!Result) {
42+
return 0;
43+
}
44+
return Data;
45+
}
46+
2347
extern "C" {
2448

2549
void SymbolizeCode(const char *ModuleName, uint64_t ModuleOffset,
@@ -38,8 +62,8 @@ void SymbolizeCode(const char *ModuleName, uint64_t ModuleOffset,
3862
llvm::symbolize::LLVMPrinter Printer(OS, EH, Config);
3963

4064
auto ResOrErr = Symbolizer.symbolizeInlinedCode(
41-
ModuleName,
42-
{ModuleOffset, llvm::object::SectionedAddress::UndefSection});
65+
ModuleName, {ModuleOffset - GetModuleBase(ModuleName),
66+
llvm::object::SectionedAddress::UndefSection});
4367

4468
if (!ResOrErr) {
4569
return;

source/loader/layers/sanitizer/stacktrace.cpp

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
*/
1212

1313
#include "stacktrace.hpp"
14+
#include "asan_interceptor.hpp"
1415
#include "ur_sanitizer_layer.hpp"
1516

1617
extern "C" {
@@ -92,9 +93,10 @@ void StackTrace::print() const {
9293
BacktraceInfo BI = BacktraceSymbols[i];
9394

9495
// Skip runtime modules
95-
if (Contains(BI, "libsycl.so") ||
96-
Contains(BI, "libpi_unified_runtime.so") ||
97-
Contains(BI, "libur_loader.so")) {
96+
if (!getContext()->interceptor->getOptions().Debug &&
97+
(Contains(BI, "libsycl.so") || Contains(BI, "libur_loader.so") ||
98+
Contains(BI, "libomptarget.rtl.unified_runtime.so") ||
99+
Contains(BI, "libomptarget.so"))) {
98100
continue;
99101
}
100102

0 commit comments

Comments
 (0)