Skip to content

[BUG][RISCV][BOLT] Incorrect GOT Relocation Handling in some case #146542

@dinyy

Description

@dinyy

I use the newest version clang and gcc(main branch ) to complie mysql-8.0.33. And bolt failed to deal with mysql. When I run this command:

 llvm-bolt mysqld  -o mysqld.test

It occuers that:

 Segmentation fault

After use gdb to debug , I found that R_RISCV_GOT_HI20 Relocation Handling failed .
Bolt think when occur GOT relocation infomation , always find 2 instruction to get imm, and transform the symbole to __BOLT_got_zero + offset , the code is in bolt\lib\Core\BinaryFunction.cpp and bolt\lib\Core\Relocation.cpp. To deal with this case:

  2242d12:       01620797                auipc   a5,0x1620
                        2242d12: R_RISCV_GOT_HI20       _ITM_deregisterTMCloneTable
                        2242d12: R_RISCV_RELAX  *ABS*
 2242d16:       7de7b783                ld      a5,2014(a5) # 38634f0 <_ITM_deregisterTMCloneTable@Base>

but the mysqld binary which is compiled by newest clang and gcc , will occur this case:

  0000000002244c08 <.Lpcrel_hi153>:

 2244c08:       01621617                auipc   a2,0x1621
                        2244c08: R_RISCV_GOT_HI20       connection_events_loop_aborted_flag
 2244c0c:       66a1                    **lui     a3,0x8**
 0000000002244c0e <.Lpcrel_hi154>:
 2244c0e:       01621717                auipc   a4,0x1621
                        2244c0e: R_RISCV_GOT_HI20       log_output_options
0000000002244c12 <.Lpcrel_hi155>:
 2244c12:       01621797                auipc   a5,0x1621
                        2244c12: R_RISCV_GOT_HI20       query_logger
 2244c16:       f2a50b93                addi    s7,a0,-214 # 3c09b28 <.L_MergedGlobals.1012>
                        2244c16: R_RISCV_PCREL_LO12_I   .Lpcrel_hi151
                        2244c16: R_RISCV_RELAX  *ABS*
 2244c1a:       d2458d93                addi    s11,a1,-732 # fb9928 <.LJTI30_0>
                        2244c1a: R_RISCV_PCREL_LO12_I   .Lpcrel_hi152
                        2244c1a: R_RISCV_RELAX  *ABS*

I try to fix it by find auipc+ld pattern when the relocation is about GOT in bolt\lib\Core\BinaryFunction.cpp ,but failed. Now I need some help to fix this bug. Could someone help me?
And I want to use bolt/utils/bughunter.sh on RISCV , but failed. It couldn't work because createRelocation and encodeValueRISCV not implemented. Are there any way to trace the bug?

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions