Skip to content

[llvm-objdump][ARM] Not implement findPltEntries for ARM lead to parse plt entry incorrectly #132694

@hstk30-hw

Description

@hstk30-hw
#include <stdio.h>

void test() {
    printf("test\n");
    return;
}

with command: clang test.c -o -fPIC -shared test.so

the llvm-objdump output like:


Disassembly of section .plt:

00000310 <$a>:
     310: e52de004      str     lr, [sp, #-4]!
     314: e59fe004      ldr     lr, [pc, #4]            @ 0x320 <.plt+0x10>
     318: e08fe00e      add     lr, pc, lr
     31c: e5bef008      ldr     pc, [lr, #8]!

00000320 <$d>:
     320: e0 8c 00 00   .word   0x00008ce0

00000324 <$a>:
     324: e28fc600      add     r12, pc, #0, #12
     328: e28cca08      add     r12, r12, #8, #20
     32c: e5bcfce0      ldr     pc, [r12, #3296]!
     330: e28fc600      add     r12, pc, #0, #12
     334: e28cca08      add     r12, r12, #8, #20
     338: e5bcfcd8      ldr     pc, [r12, #3288]!
     33c: e28fc600      add     r12, pc, #0, #12
     340: e28cca08      add     r12, r12, #8, #20
     344: e5bcfcd0      ldr     pc, [r12, #3280]!
     348: e28fc600      add     r12, pc, #0, #12
     34c: e28cca08      add     r12, r12, #8, #20
     350: e5bcfcc8      ldr     pc, [r12, #3272]!
     354: e28fc600      add     r12, pc, #0, #12
     358: e28cca08      add     r12, r12, #8, #20
     35c: e5bcfcc0      ldr     pc, [r12, #3264]!

...

00000454 <test>:
     454: e92d4800      push    {r11, lr}
     458: e1a0b00d      mov     r11, sp
     45c: e59f0008      ldr     r0, [pc, #8]            @ 0x46c <test+0x18>
     460: e08f0000      add     r0, pc, r0
     464: ebffffb1      bl      0x330 <.plt+0x20>       @ imm = #-316
     468: e8bd8800      pop     {r11, pc}

switch (Triple.getArch()) {
case Triple::x86:
JumpSlotReloc = ELF::R_386_JUMP_SLOT;
GlobDatReloc = ELF::R_386_GLOB_DAT;
break;
case Triple::x86_64:
JumpSlotReloc = ELF::R_X86_64_JUMP_SLOT;
GlobDatReloc = ELF::R_X86_64_GLOB_DAT;
break;
case Triple::aarch64:
case Triple::aarch64_be:
JumpSlotReloc = ELF::R_AARCH64_JUMP_SLOT;
break;
case Triple::hexagon:
JumpSlotReloc = ELF::R_HEX_JMP_SLOT;
GlobDatReloc = ELF::R_HEX_GLOB_DAT;
break;
default:
return {};
}

Not support for ARM32,

and we also need to implement findPltEntries for ARMMCInstrAnalysis class.

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions