drgn/libdrgn/arch_arm.c
Omar Sandoval d27204260e libdrgn: add stub Arm architecture with relocation implementation
The only relocation type I saw in Debian's kernel module debug info was
R_ARM_ABS32. R_ARM_REL32 is easy. The Linux kernel supports a bunch of
other ones that don't seem relevant to debug info.

Unfortunately, I wasn't able to test this because /proc/kcore doesn't
exist on Arm. This apparently goes all the way back to 2003:
https://lwn.net/Articles/45315/.

Signed-off-by: Omar Sandoval <osandov@osandov.com>
2022-04-19 00:25:05 -07:00

39 lines
1.1 KiB
C

// Copyright (c) Meta Platforms, Inc. and affiliates.
// SPDX-License-Identifier: GPL-3.0-or-later
#include "platform.h" // IWYU pragma: associated
/*
* The ABI specification can be found at:
* https://developer.arm.com/architectures/system-architectures/software-standards/abi
* https://github.com/ARM-software/abi-aa/releases
*/
static struct drgn_error *
apply_elf_reloc_arm(const struct drgn_relocating_section *relocating,
uint64_t r_offset, uint32_t r_type, const int64_t *r_addend,
uint64_t sym_value)
{
switch (r_type) {
case R_ARM_NONE:
return NULL;
case R_ARM_ABS32:
return drgn_reloc_add32(relocating, r_offset, r_addend,
sym_value);
case R_ARM_REL32:
return drgn_reloc_add32(relocating, r_offset, r_addend,
sym_value
- (relocating->addr + r_offset));
default:
return DRGN_UNKNOWN_RELOCATION_TYPE(r_type);
}
}
const struct drgn_architecture_info arch_info_arm = {
.name = "Arm",
.arch = DRGN_ARCH_ARM,
.default_flags = DRGN_PLATFORM_IS_LITTLE_ENDIAN,
.register_by_name = drgn_register_by_name_unknown,
.apply_elf_reloc = apply_elf_reloc_arm,
};