1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0-only 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * 32-bit compatibility support for ELF format executables and core dumps. 4*4882a593Smuzhiyun * 5*4882a593Smuzhiyun * Copyright (C) 2007 Red Hat, Inc. All rights reserved. 6*4882a593Smuzhiyun * 7*4882a593Smuzhiyun * Red Hat Author: Roland McGrath. 8*4882a593Smuzhiyun * 9*4882a593Smuzhiyun * This file is used in a 64-bit kernel that wants to support 32-bit ELF. 10*4882a593Smuzhiyun * asm/elf.h is responsible for defining the compat_* and COMPAT_* macros 11*4882a593Smuzhiyun * used below, with definitions appropriate for 32-bit ABI compatibility. 12*4882a593Smuzhiyun * 13*4882a593Smuzhiyun * We use macros to rename the ABI types and machine-dependent 14*4882a593Smuzhiyun * functions used in binfmt_elf.c to compat versions. 15*4882a593Smuzhiyun */ 16*4882a593Smuzhiyun 17*4882a593Smuzhiyun #include <linux/elfcore-compat.h> 18*4882a593Smuzhiyun #include <linux/time.h> 19*4882a593Smuzhiyun 20*4882a593Smuzhiyun #define ELF_COMPAT 1 21*4882a593Smuzhiyun 22*4882a593Smuzhiyun /* 23*4882a593Smuzhiyun * Rename the basic ELF layout types to refer to the 32-bit class of files. 24*4882a593Smuzhiyun */ 25*4882a593Smuzhiyun #undef ELF_CLASS 26*4882a593Smuzhiyun #define ELF_CLASS ELFCLASS32 27*4882a593Smuzhiyun 28*4882a593Smuzhiyun #undef elfhdr 29*4882a593Smuzhiyun #undef elf_phdr 30*4882a593Smuzhiyun #undef elf_shdr 31*4882a593Smuzhiyun #undef elf_note 32*4882a593Smuzhiyun #undef elf_addr_t 33*4882a593Smuzhiyun #undef ELF_GNU_PROPERTY_ALIGN 34*4882a593Smuzhiyun #define elfhdr elf32_hdr 35*4882a593Smuzhiyun #define elf_phdr elf32_phdr 36*4882a593Smuzhiyun #define elf_shdr elf32_shdr 37*4882a593Smuzhiyun #define elf_note elf32_note 38*4882a593Smuzhiyun #define elf_addr_t Elf32_Addr 39*4882a593Smuzhiyun #define ELF_GNU_PROPERTY_ALIGN ELF32_GNU_PROPERTY_ALIGN 40*4882a593Smuzhiyun 41*4882a593Smuzhiyun /* 42*4882a593Smuzhiyun * Some data types as stored in coredump. 43*4882a593Smuzhiyun */ 44*4882a593Smuzhiyun #define user_long_t compat_long_t 45*4882a593Smuzhiyun #define user_siginfo_t compat_siginfo_t 46*4882a593Smuzhiyun #define copy_siginfo_to_external copy_siginfo_to_external32 47*4882a593Smuzhiyun 48*4882a593Smuzhiyun /* 49*4882a593Smuzhiyun * The machine-dependent core note format types are defined in elfcore-compat.h, 50*4882a593Smuzhiyun * which requires asm/elf.h to define compat_elf_gregset_t et al. 51*4882a593Smuzhiyun */ 52*4882a593Smuzhiyun #define elf_prstatus compat_elf_prstatus 53*4882a593Smuzhiyun #define elf_prpsinfo compat_elf_prpsinfo 54*4882a593Smuzhiyun 55*4882a593Smuzhiyun #undef ns_to_kernel_old_timeval 56*4882a593Smuzhiyun #define ns_to_kernel_old_timeval ns_to_old_timeval32 57*4882a593Smuzhiyun 58*4882a593Smuzhiyun /* 59*4882a593Smuzhiyun * To use this file, asm/elf.h must define compat_elf_check_arch. 60*4882a593Smuzhiyun * The other following macros can be defined if the compat versions 61*4882a593Smuzhiyun * differ from the native ones, or omitted when they match. 62*4882a593Smuzhiyun */ 63*4882a593Smuzhiyun 64*4882a593Smuzhiyun #undef ELF_ARCH 65*4882a593Smuzhiyun #undef elf_check_arch 66*4882a593Smuzhiyun #define elf_check_arch compat_elf_check_arch 67*4882a593Smuzhiyun 68*4882a593Smuzhiyun #ifdef COMPAT_ELF_PLATFORM 69*4882a593Smuzhiyun #undef ELF_PLATFORM 70*4882a593Smuzhiyun #define ELF_PLATFORM COMPAT_ELF_PLATFORM 71*4882a593Smuzhiyun #endif 72*4882a593Smuzhiyun 73*4882a593Smuzhiyun #ifdef COMPAT_ELF_HWCAP 74*4882a593Smuzhiyun #undef ELF_HWCAP 75*4882a593Smuzhiyun #define ELF_HWCAP COMPAT_ELF_HWCAP 76*4882a593Smuzhiyun #endif 77*4882a593Smuzhiyun 78*4882a593Smuzhiyun #ifdef COMPAT_ELF_HWCAP2 79*4882a593Smuzhiyun #undef ELF_HWCAP2 80*4882a593Smuzhiyun #define ELF_HWCAP2 COMPAT_ELF_HWCAP2 81*4882a593Smuzhiyun #endif 82*4882a593Smuzhiyun 83*4882a593Smuzhiyun #ifdef COMPAT_ARCH_DLINFO 84*4882a593Smuzhiyun #undef ARCH_DLINFO 85*4882a593Smuzhiyun #define ARCH_DLINFO COMPAT_ARCH_DLINFO 86*4882a593Smuzhiyun #endif 87*4882a593Smuzhiyun 88*4882a593Smuzhiyun #ifdef COMPAT_ELF_ET_DYN_BASE 89*4882a593Smuzhiyun #undef ELF_ET_DYN_BASE 90*4882a593Smuzhiyun #define ELF_ET_DYN_BASE COMPAT_ELF_ET_DYN_BASE 91*4882a593Smuzhiyun #endif 92*4882a593Smuzhiyun 93*4882a593Smuzhiyun #ifdef COMPAT_ELF_EXEC_PAGESIZE 94*4882a593Smuzhiyun #undef ELF_EXEC_PAGESIZE 95*4882a593Smuzhiyun #define ELF_EXEC_PAGESIZE COMPAT_ELF_EXEC_PAGESIZE 96*4882a593Smuzhiyun #endif 97*4882a593Smuzhiyun 98*4882a593Smuzhiyun #ifdef COMPAT_ELF_PLAT_INIT 99*4882a593Smuzhiyun #undef ELF_PLAT_INIT 100*4882a593Smuzhiyun #define ELF_PLAT_INIT COMPAT_ELF_PLAT_INIT 101*4882a593Smuzhiyun #endif 102*4882a593Smuzhiyun 103*4882a593Smuzhiyun #ifdef COMPAT_SET_PERSONALITY 104*4882a593Smuzhiyun #undef SET_PERSONALITY 105*4882a593Smuzhiyun #define SET_PERSONALITY COMPAT_SET_PERSONALITY 106*4882a593Smuzhiyun #endif 107*4882a593Smuzhiyun 108*4882a593Smuzhiyun #ifdef compat_start_thread 109*4882a593Smuzhiyun #undef start_thread 110*4882a593Smuzhiyun #define start_thread compat_start_thread 111*4882a593Smuzhiyun #endif 112*4882a593Smuzhiyun 113*4882a593Smuzhiyun #ifdef compat_arch_setup_additional_pages 114*4882a593Smuzhiyun #undef ARCH_HAS_SETUP_ADDITIONAL_PAGES 115*4882a593Smuzhiyun #define ARCH_HAS_SETUP_ADDITIONAL_PAGES 1 116*4882a593Smuzhiyun #undef arch_setup_additional_pages 117*4882a593Smuzhiyun #define arch_setup_additional_pages compat_arch_setup_additional_pages 118*4882a593Smuzhiyun #endif 119*4882a593Smuzhiyun 120*4882a593Smuzhiyun #ifdef compat_elf_read_implies_exec 121*4882a593Smuzhiyun #undef elf_read_implies_exec 122*4882a593Smuzhiyun #define elf_read_implies_exec compat_elf_read_implies_exec 123*4882a593Smuzhiyun #endif 124*4882a593Smuzhiyun 125*4882a593Smuzhiyun /* 126*4882a593Smuzhiyun * Rename a few of the symbols that binfmt_elf.c will define. 127*4882a593Smuzhiyun * These are all local so the names don't really matter, but it 128*4882a593Smuzhiyun * might make some debugging less confusing not to duplicate them. 129*4882a593Smuzhiyun */ 130*4882a593Smuzhiyun #define elf_format compat_elf_format 131*4882a593Smuzhiyun #define init_elf_binfmt init_compat_elf_binfmt 132*4882a593Smuzhiyun #define exit_elf_binfmt exit_compat_elf_binfmt 133*4882a593Smuzhiyun 134*4882a593Smuzhiyun /* 135*4882a593Smuzhiyun * We share all the actual code with the native (64-bit) version. 136*4882a593Smuzhiyun */ 137*4882a593Smuzhiyun #include "binfmt_elf.c" 138