Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F174303427
D609.id1117.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
3 KB
Referenced Files
None
Subscribers
None
D609.id1117.diff
View Options
Index: sys/arm/arm/elf_machdep.c
===================================================================
--- sys/arm/arm/elf_machdep.c
+++ sys/arm/arm/elf_machdep.c
@@ -46,6 +46,8 @@
#include <machine/elf.h>
#include <machine/md_var.h>
+static boolean_t elf32_arm_check_abi(struct image_params *, const Elf_Ehdr *);
+
struct sysentvec elf32_freebsd_sysvec = {
.sv_size = SYS_MAXSYSCALL,
.sv_table = sysent,
@@ -90,7 +92,8 @@
.sysvec = &elf32_freebsd_sysvec,
.interp_newpath = NULL,
.brand_note = &elf32_freebsd_brandnote,
- .flags = BI_CAN_EXEC_DYN | BI_BRAND_NOTE
+ .flags = BI_CAN_EXEC_DYN | BI_BRAND_NOTE,
+ .check_header = elf32_arm_check_abi,
};
SYSINIT(elf32, SI_SUB_EXEC, SI_ORDER_FIRST,
@@ -107,12 +110,31 @@
.interp_newpath = NULL,
.brand_note = &elf32_freebsd_brandnote,
.flags = BI_CAN_EXEC_DYN | BI_BRAND_NOTE
+ .check_header = elf32_arm_check_abi,
};
SYSINIT(oelf32, SI_SUB_EXEC, SI_ORDER_ANY,
(sysinit_cfunc_t) elf32_insert_brand_entry,
&freebsd_brand_oinfo);
+static boolean_t
+elf32_arm_check_abi(struct image_params *imgp, const Elf_Ehdr *hdr)
+{
+#ifdef __ARM_EABI__
+ /*
+ * When configured for EABI, FreeBSD supports EABI vesions 4 and 5.
+ */
+ if (EF_ARM_EABI_VERSION(hdr->e_flags) < EF_ARM_EABI_FREEBSD_MIN)
+ return (FALSE);
+#else
+ /*
+ * When configured for OABI, that's all we do, so reject EABI binaries.
+ */
+ if (EF_ARM_EABI_VERSION(hdr->e_flags) != EF_ARM_EABI_VERSION_UNKNOWN)
+ return (FALSE);
+#endif
+ return (TRUE);
+}
void
elf32_dump_thread(struct thread *td __unused, void *dst __unused,
Index: sys/arm/include/elf.h
===================================================================
--- sys/arm/include/elf.h
+++ sys/arm/include/elf.h
@@ -103,6 +103,12 @@
#define ELF_TARG_MACH EM_ARM
#define ELF_TARG_VER 1
+/* Defines specific for arm headers */
+#define EF_ARM_EABIMASK 0xff000000
+#define EF_ARM_EABI_VERSION(x) (((x) & EF_ARM_EABIMASK) >> 24)
+#define EF_ARM_EABI_VERSION_UNKNOWN 0
+#define EF_ARM_EABI_FREEBSD_MIN 4
+
/*
* Magic number for the elf trampoline, chosen wisely to be an immediate
* value.
Index: sys/kern/imgact_elf.c
===================================================================
--- sys/kern/imgact_elf.c
+++ sys/kern/imgact_elf.c
@@ -294,6 +294,19 @@
return (bi);
}
+ /* No known brand, see if the header is recognized by any brand */
+ for (i = 0; i < MAX_BRANDS; i++) {
+ bi = elf_brand_list[i];
+ if (bi == NULL || bi->flags & BI_BRAND_NOTE_MANDATORY ||
+ bi->check_header == NULL)
+ continue;
+ if (hdr->e_machine == bi->machine) {
+ ret = bi->check_header(imgp, hdr);
+ if (ret)
+ return (bi);
+ }
+ }
+
/* Lacking a known brand, search for a recognized interpreter. */
if (interp != NULL) {
for (i = 0; i < MAX_BRANDS; i++) {
Index: sys/sys/imgact_elf.h
===================================================================
--- sys/sys/imgact_elf.h
+++ sys/sys/imgact_elf.h
@@ -74,6 +74,7 @@
const char *interp_newpath;
int flags;
Elf_Brandnote *brand_note;
+ boolean_t (*check_header)(struct image_params *, const Elf_Ehdr *);
#define BI_CAN_EXEC_DYN 0x0001
#define BI_BRAND_NOTE 0x0002 /* May have note.ABI-tag section. */
#define BI_BRAND_NOTE_MANDATORY 0x0004 /* Must have note.ABI-tag section. */
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Sat, Oct 3, 5:07 AM (3 h, 33 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
40113964
Default Alt Text
D609.id1117.diff (3 KB)
Attached To
Mode
D609: Implement MD header filter for elf binaries.
Attached
Detach File
Event Timeline
Log In to Comment