1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-only */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * Copyright (c) 2021, The Linux Foundation. All rights reserved. 4*4882a593Smuzhiyun * Copyright (c) 2023 Rockchip Electronics Co., Ltd. 5*4882a593Smuzhiyun */ 6*4882a593Smuzhiyun 7*4882a593Smuzhiyun #ifndef __ROCKCHIP_ELF_COMMON_H 8*4882a593Smuzhiyun #define __ROCKCHIP_ELF_COMMON_H 9*4882a593Smuzhiyun 10*4882a593Smuzhiyun #include <linux/elf.h> 11*4882a593Smuzhiyun 12*4882a593Smuzhiyun /* Generic helpers for ELF use */ 13*4882a593Smuzhiyun /* Return first section header */ elf_sheader(struct elfhdr * hdr)14*4882a593Smuzhiyunstatic inline struct elf_shdr *elf_sheader(struct elfhdr *hdr) 15*4882a593Smuzhiyun { 16*4882a593Smuzhiyun return (struct elf_shdr *)((size_t)hdr + (size_t)hdr->e_shoff); 17*4882a593Smuzhiyun } 18*4882a593Smuzhiyun 19*4882a593Smuzhiyun /* Return idx section header */ elf_section(struct elfhdr * hdr,int idx)20*4882a593Smuzhiyunstatic inline struct elf_shdr *elf_section(struct elfhdr *hdr, int idx) 21*4882a593Smuzhiyun { 22*4882a593Smuzhiyun return &elf_sheader(hdr)[idx]; 23*4882a593Smuzhiyun } 24*4882a593Smuzhiyun 25*4882a593Smuzhiyun /* Return first program header */ elf_pheader(struct elfhdr * hdr)26*4882a593Smuzhiyunstatic inline struct elf_phdr *elf_pheader(struct elfhdr *hdr) 27*4882a593Smuzhiyun { 28*4882a593Smuzhiyun return (struct elf_phdr *)((size_t)hdr + (size_t)hdr->e_phoff); 29*4882a593Smuzhiyun } 30*4882a593Smuzhiyun 31*4882a593Smuzhiyun /* Return idx program header */ elf_program(struct elfhdr * hdr,int idx)32*4882a593Smuzhiyunstatic inline struct elf_phdr *elf_program(struct elfhdr *hdr, int idx) 33*4882a593Smuzhiyun { 34*4882a593Smuzhiyun return &elf_pheader(hdr)[idx]; 35*4882a593Smuzhiyun } 36*4882a593Smuzhiyun 37*4882a593Smuzhiyun /* Return section's string table header */ elf_str_table(struct elfhdr * hdr)38*4882a593Smuzhiyunstatic inline char *elf_str_table(struct elfhdr *hdr) 39*4882a593Smuzhiyun { 40*4882a593Smuzhiyun if (hdr->e_shstrndx == SHN_UNDEF) 41*4882a593Smuzhiyun return NULL; 42*4882a593Smuzhiyun return (char *)hdr + elf_section(hdr, hdr->e_shstrndx)->sh_offset; 43*4882a593Smuzhiyun } 44*4882a593Smuzhiyun 45*4882a593Smuzhiyun #endif 46