Skip to content

Using SuperPMI with crossgen2 (aot). SIGSEGV. #38430

Closed
@0xfk0

Description

@0xfk0

How can we use SuperPMI tool with crossgen2 (aot) ?

As I understood, we should not use environment variables COMPlus_AltJitName and COMPlus_AltJitNgen, because these variables analyzed only by zapper class (crossgen1), but instead crossgen2 provide --codegenopt comand line option. And where is no AltJitName option in Jit interface, instead we should use command option --jitpath, like this:

--jitpath=/home/sysop/bin/clr/libsuperpmi-shim-simple.so   --codegenopt "AltJitNgen=*"

Also we should provide following environment variables (these options used by libsuperpmi library):

env SuperPMIShimLogPath=/tmp/2 SuperPMIShimPath=/home/sysop/clr/libclrjit.so

Unfortunately, this doesn't work. Crossgen2 crashes with SIGSEGV.

Full command line:

env SuperPMIShimLogPath=/tmp/2 SuperPMIShimPath=/home/sysop/bin/clr/libclrjit.so COMPlus_AltJitNgen="*" gdb --args ~/bin/clr/corerun /home/sysop/dotnet-runtime/artifacts/bin/coreclr/Linux.x64.Checked/crossgen2/crossgen2.dll --jitpath=/home/sysop/bin/clr/libsuperpmi-shim-simple.so --codegenopt "AltJitNgen=*" -r:/home/sysop/bin/clr/System.*.dll -r:/home/sysop/bin/clr/Microsoft.*.dll -r:/home/sysop/bin/clr/mscorlib.dll -r:/home/sysop/bin/clr/netstandard.dll -O --map --dmgllog dgml --fulllog -o bug10.ni.dll bug10.dll

Additional diagnostics:

#0  sigsegv_handler (code=11, siginfo=0x7ffff7fd34b0, context=0x7ffff7fd3380)
    at /home/sysop/dotnet-runtime/src/coreclr/src/pal/src/exception/signal.cpp:511
#1  <signal handler called>
#2  0x00007fff4548397c in FindEnvVarValue (name=<optimized out>)
    at /home/sysop/dotnet-runtime/src/coreclr/src/pal/src/misc/environ.cpp:920
#3  EnvironGetenv (name=0x555555cc5e00 "HOME", copyValue=0)
    at /home/sysop/dotnet-runtime/src/coreclr/src/pal/src/misc/environ.cpp:974
#4  0x00007fff454838a3 in GetEnvironmentVariableA (lpName=0x555555cc5e00 "HOME", lpBuffer=0x0, nSize=0)
    at /home/sysop/dotnet-runtime/src/coreclr/src/pal/src/misc/environ.cpp:121
#5  0x00007fff45483d14 in GetEnvironmentVariableW (lpName=0x7fff454db77e u"HOME", lpBuffer=0x0, nSize=0)
    at /home/sysop/dotnet-runtime/src/coreclr/src/pal/src/misc/environ.cpp:214
#6  0x00007fff4542332a in GetEnvironmentVariableWithDefaultW (envVarName=0x7fff454db77e u"HOME",
    defaultValue=0x7fff454f1890 u".")
    at /home/sysop/dotnet-runtime/src/coreclr/src/ToolBox/superpmi/superpmi-shared/spmiutil.cpp:70
#7  0x00007fff453baa35 in SetDefaultPaths ()
    at /home/sysop/dotnet-runtime/src/coreclr/src/ToolBox/superpmi/superpmi-shim-simple/superpmi-shim-simple.cpp:29
#8  0x00007fff453baef2 in jitStartup (host=0x555555cc8190)
    at /home/sysop/dotnet-runtime/src/coreclr/src/ToolBox/superpmi/superpmi-shim-simple/superpmi-shim-simple.cpp:100
#9  0x00007fff7dd07b8a in ?? ()
#10 0xffffffffffffffff in ?? ()
#11 0x9abcdef012345678 in ?? ()
#12 0x00007ffff6bebc58 in vtable for InlinedCallFrame () from /home/sysop/bin/clr/libcoreclr.so
#13 0x00007fffffffb7a8 in ?? ()
#14 0x00007fff7dff0900 in ?? ()
...


(gdb) frame 2
#2  0x00007fff4548397c in FindEnvVarValue (name=<optimized out>)
    at /home/sysop/dotnet-runtime/src/coreclr/src/pal/src/misc/environ.cpp:920
920         for (int i = 0; palEnvironment[i] != nullptr; ++i)

(gdb) disassemble $pc
Dump of assembler code for function EnvironGetenv(char const*, BOOL):
  ...
   0x00007fff45483975 <+69>:    mov    0x2f4f4c(%rip),%rsi        # 0x7fff457788c8 <palEnvironment>
=> 0x00007fff4548397c <+76>:    mov    (%rsi),%rbx

(gdb) info registers
...
rsi            0x0      0

(gdb) p siginfo._sifields._sigfault.si_addr
$36 = (void *) 0x0

(gdb) x/llx 0x7fff457788c8
0x7fff457788c8 <palEnvironment>:        0x0000000000000000

(gdb) p palEnvironment
$37 = (char **) 0x55555578abc0

(gdb) info address palEnvironment
Symbol "palEnvironment" is static storage at address 0x7ffff6c6ee88.

(gdb) x/gx 0x7ffff6c6ee88
0x7ffff6c6ee88 <palEnvironment>:        0x000055555578abc0

(gdb) p *(char**)0x000055555578abc0@8
$40 = {
  0x55555578ae30 "LS_COLORS=no=00:fi=00:di=04:ln=36:pi=40;33:so=35:do=35:bd=40;33:cd=40;33:or=40;31:ex=32:*.c=33:*.C=33:*.cc=33:*.c++=33:*.cpp=33:*.CPP=33:*.h=33:*.H=33:*.hpp=33:*.HPP=33:*.s=33:*.S=33:*.ASM=33:*.asm=33"...,
  0x555555775930 "MC_SID=3447", 0x5555557764f0 "SSH_CONNECTION=106.210.109.248 25744 106.109.128.209 22",
  0x55555578b0f0 "LESSCLOSE=/usr/bin/lesspipe %s %s", 0x555555775240 "_=/usr/bin/env",
  0x555555778c90 "LANG=ru_RU.UTF-8", 0x555555775b50 "HISTCONTROL=ignoreboth",
  0x555555779b40 "SuperPMIShimPath=/home/sysop/bin/clr/libclrjit.so"}


(gdb) info files
...
0x00007ffff6c30580 - 0x00007ffff6c81920 is .bss in /home/sysop/bin/clr/libcoreclr.so
0x00007fff45760050 - 0x00007fff45783a00 is .bss in /home/sysop/bin/clr/libsuperpmi-shim-simple.so

As you can see there is two instances of palEnvironment variable, each one belongs to different libraries (libcoreclr.so, as I guess, and libsuperpmi-shim-simple.so). And second one isn't initialized.

I think there is some issue with dynamic library loading. SuperPMI works fine with crossgen1 or coreclr itself, the issue exists only with crossgen2.

The issue is reproduced on x64 and ARM platforms.

category:eng-sys
theme:super-pmi
skill-level:intermediate
cost:medium

Metadata

Metadata

Assignees

Labels

area-CodeGen-coreclrCLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI

Type

No type

Projects

No projects

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions