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