Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

x86: compat_binfmt_elf

This adds fs/compat_binfmt_elf.c, a wrapper around fs/binfmt_elf.c for
32-bit ELF support on 64-bit kernels. It can replace all the hand-rolled
versions of this that each 32/64 arch has, which are all about the same.

To use this, an arch's asm/elf.h has to define at least a few compat_*
macros that parallel the various macros that fs/binfmt_elf.c uses for
native support.

There is no attempt to deal with compat macros for the core dump format
support. To use this file, the arch has to define compat_gregset_t for
linux/elfcore-compat.h and #define CORE_DUMP_USE_REGSET. The 32-bit
compatible formats should come automatically from task_user_regset_view
called on a 32-bit task.

Signed-off-by: Roland McGrath <roland@redhat.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>

authored by

Roland McGrath and committed by
Ingo Molnar
2f79e48a bae3f7c3

+131
+131
fs/compat_binfmt_elf.c
··· 1 + /* 2 + * 32-bit compatibility support for ELF format executables and core dumps. 3 + * 4 + * Copyright (C) 2007 Red Hat, Inc. All rights reserved. 5 + * 6 + * This copyrighted material is made available to anyone wishing to use, 7 + * modify, copy, or redistribute it subject to the terms and conditions 8 + * of the GNU General Public License v.2. 9 + * 10 + * Red Hat Author: Roland McGrath. 11 + * 12 + * This file is used in a 64-bit kernel that wants to support 32-bit ELF. 13 + * asm/elf.h is responsible for defining the compat_* and COMPAT_* macros 14 + * used below, with definitions appropriate for 32-bit ABI compatibility. 15 + * 16 + * We use macros to rename the ABI types and machine-dependent 17 + * functions used in binfmt_elf.c to compat versions. 18 + */ 19 + 20 + #include <linux/elfcore-compat.h> 21 + #include <linux/time.h> 22 + 23 + /* 24 + * Rename the basic ELF layout types to refer to the 32-bit class of files. 25 + */ 26 + #undef ELF_CLASS 27 + #define ELF_CLASS ELFCLASS32 28 + 29 + #undef elfhdr 30 + #undef elf_phdr 31 + #undef elf_note 32 + #undef elf_addr_t 33 + #define elfhdr elf32_hdr 34 + #define elf_phdr elf32_phdr 35 + #define elf_note elf32_note 36 + #define elf_addr_t Elf32_Addr 37 + 38 + /* 39 + * The machine-dependent core note format types are defined in elfcore-compat.h, 40 + * which requires asm/elf.h to define compat_elf_gregset_t et al. 41 + */ 42 + #define elf_prstatus compat_elf_prstatus 43 + #define elf_prpsinfo compat_elf_prpsinfo 44 + 45 + /* 46 + * Compat version of cputime_to_compat_timeval, perhaps this 47 + * should be an inline in <linux/compat.h>. 48 + */ 49 + static void cputime_to_compat_timeval(const cputime_t cputime, 50 + struct compat_timeval *value) 51 + { 52 + struct timeval tv; 53 + cputime_to_timeval(cputime, &tv); 54 + value->tv_sec = tv.tv_sec; 55 + value->tv_usec = tv.tv_usec; 56 + } 57 + 58 + #undef cputime_to_timeval 59 + #define cputime_to_timeval cputime_to_compat_timeval 60 + 61 + 62 + /* 63 + * To use this file, asm/elf.h must define compat_elf_check_arch. 64 + * The other following macros can be defined if the compat versions 65 + * differ from the native ones, or omitted when they match. 66 + */ 67 + 68 + #undef ELF_ARCH 69 + #undef elf_check_arch 70 + #define elf_check_arch compat_elf_check_arch 71 + 72 + #ifdef COMPAT_ELF_PLATFORM 73 + #undef ELF_PLATFORM 74 + #define ELF_PLATFORM COMPAT_ELF_PLATFORM 75 + #endif 76 + 77 + #ifdef COMPAT_ELF_HWCAP 78 + #undef ELF_HWCAP 79 + #define ELF_HWCAP COMPAT_ELF_HWCAP 80 + #endif 81 + 82 + #ifdef COMPAT_ARCH_DLINFO 83 + #undef ARCH_DLINFO 84 + #define ARCH_DLINFO COMPAT_ARCH_DLINFO 85 + #endif 86 + 87 + #ifdef COMPAT_ELF_ET_DYN_BASE 88 + #undef ELF_ET_DYN_BASE 89 + #define ELF_ET_DYN_BASE COMPAT_ELF_ET_DYN_BASE 90 + #endif 91 + 92 + #ifdef COMPAT_ELF_EXEC_PAGESIZE 93 + #undef ELF_EXEC_PAGESIZE 94 + #define ELF_EXEC_PAGESIZE COMPAT_ELF_EXEC_PAGESIZE 95 + #endif 96 + 97 + #ifdef COMPAT_ELF_PLAT_INIT 98 + #undef ELF_PLAT_INIT 99 + #define ELF_PLAT_INIT COMPAT_ELF_PLAT_INIT 100 + #endif 101 + 102 + #ifdef COMPAT_SET_PERSONALITY 103 + #undef SET_PERSONALITY 104 + #define SET_PERSONALITY COMPAT_SET_PERSONALITY 105 + #endif 106 + 107 + #ifdef compat_start_thread 108 + #undef start_thread 109 + #define start_thread compat_start_thread 110 + #endif 111 + 112 + #ifdef compat_arch_setup_additional_pages 113 + #undef ARCH_HAS_SETUP_ADDITIONAL_PAGES 114 + #define ARCH_HAS_SETUP_ADDITIONAL_PAGES 1 115 + #undef arch_setup_additional_pages 116 + #define arch_setup_additional_pages compat_arch_setup_additional_pages 117 + #endif 118 + 119 + /* 120 + * Rename a few of the symbols that binfmt_elf.c will define. 121 + * These are all local so the names don't really matter, but it 122 + * might make some debugging less confusing not to duplicate them. 123 + */ 124 + #define elf_format compat_elf_format 125 + #define init_elf_binfmt init_compat_elf_binfmt 126 + #define exit_elf_binfmt exit_compat_elf_binfmt 127 + 128 + /* 129 + * We share all the actual code with the native (64-bit) version. 130 + */ 131 + #include "binfmt_elf.c"