* [gentoo-commits] proj/elfix:master commit in: misc/elf-abi/
@ 2015-01-03 23:19 Anthony G. Basile
0 siblings, 0 replies; 11+ messages in thread
From: Anthony G. Basile @ 2015-01-03 23:19 UTC (permalink / raw
To: gentoo-commits
commit: a66ab9b88abf14b353a0720791e055bd901d1c6f
Author: Anthony G. Basile <blueness <AT> gentoo <DOT> org>
AuthorDate: Sat Jan 3 23:20:03 2015 +0000
Commit: Anthony G. Basile <blueness <AT> gentoo <DOT> org>
CommitDate: Sat Jan 3 23:20:03 2015 +0000
URL: http://sources.gentoo.org/gitweb/?p=proj/elfix.git;a=commit;h=a66ab9b8
misc/elf-abi: read arch:abi:endian from an ELF, bug #534206
---
misc/elf-abi/.gitignore | 2 +
misc/elf-abi/Makefile | 18 +++
misc/elf-abi/elf-abi.c | 314 ++++++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 334 insertions(+)
diff --git a/misc/elf-abi/.gitignore b/misc/elf-abi/.gitignore
new file mode 100644
index 0000000..7ec9e50
--- /dev/null
+++ b/misc/elf-abi/.gitignore
@@ -0,0 +1,2 @@
+elf-abi
+!Makefile
diff --git a/misc/elf-abi/Makefile b/misc/elf-abi/Makefile
new file mode 100644
index 0000000..8a75d55
--- /dev/null
+++ b/misc/elf-abi/Makefile
@@ -0,0 +1,18 @@
+CFLAGS ?= -O2 -pipe -g
+CFLAGS += -Wall
+PWD = $$(pwd)
+
+all: elf-abi
+
+elf-abi: elf-abi.c
+ $(CC) $(CFLAGS) $(CPPFLAGS) $(LDFLAGS) -o $@ $< $(LDLIBS)
+
+PREFIX = /usr
+BINDIR = $(PREFIX)/bin
+install: elf-abi
+ install -m 755 -D elf-abi $(DESTDIR)$(BINDIR)/$<
+
+clean:
+ rm -f *.o *~ elf-abi
+
+.PHONY: all clean install
diff --git a/misc/elf-abi/elf-abi.c b/misc/elf-abi/elf-abi.c
new file mode 100644
index 0000000..589d458
--- /dev/null
+++ b/misc/elf-abi/elf-abi.c
@@ -0,0 +1,314 @@
+/* Copyright 2015 Gentoo Foundation
+ * Distributed under the terms of the GNU General Public License v2
+ *
+ * Compute a multilib ABI identifier, as discussed here:
+ *
+ * https://bugs.gentoo.org/show_bug.cgi?id=534206
+ *
+ * Supported identifiers:
+ *
+ * alpha_32
+ * arm_{oabi32,32,64}
+ * hppa_32,64
+ * ia_64
+ * m68k_32
+ * mips_{n32,n64,o32}
+ * ppc_{32,64}
+ * s390_32
+ * sh_32
+ * sparc_{32,64}
+ * x86_{32,x32,64}
+ *
+ * NOTES:
+ *
+ * * The ABIs referenced by some of the above *_32 and *_64 identifiers
+ * may be imaginary, but they are listed anyway, since the goal is to
+ * establish a naming convention that is as consistent and uniform as
+ * possible.
+ *
+ * * The Elf header's e_ident[EI_OSABI] byte is completely ignored,
+ * since OS-independence is one of the goals. The assumption is that,
+ * for given installation, we are only interested in tracking multilib
+ * ABIs for a single OS.
+ *
+ * REFERENCE:
+ *
+ * http://www.sco.com/developers/gabi/2000-07-17/ch4.eheader.html
+ *
+ *
+ * Copyright 2015 Anthony G. Basile - <blueness@gentoo.org>
+ * Copyright 2015 Zac Medico - <zmedico@gentoo.org>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdint.h>
+#include <err.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <endian.h>
+
+/* We steal this from <elf.h> but don't include it so as to not increase our dependancies. */
+#define ELFMAG "\177ELF"
+
+#define ELFCLASS32 1 /* 32-bit objects */
+#define ELFCLASS64 2 /* 64-bit objects */
+#define ELFDATA2LSB 1 /* 2's complement, little endian */
+#define ELFDATA2MSB 2 /* 2's complement, big endian */
+
+#define EM_SPARC 2 /* SUN SPARC */
+#define EM_386 3 /* Intel 80386 */
+#define EM_68K 4 /* Motorola m68k family */
+#define EM_MIPS 8 /* MIPS R3000 big-endian */
+#define EM_MIPS_RS3_LE 10 /* MIPS R3000 little-endian */
+#define EM_PARISC 15 /* HPPA */
+#define EM_SPARC32PLUS 18 /* Sun's "v8plus" */
+#define EM_PPC 20 /* PowerPC */
+#define EM_PPC64 21 /* PowerPC 64-bit */
+#define EM_S390 22 /* IBM S390 */
+#define EM_ARM 40 /* ARM */
+#define EM_FAKE_ALPHA 41 /* Digital Alpha */
+#define EM_SH 42 /* Hitachi SH */
+#define EM_SPARCV9 43 /* SPARC v9 64-bit */
+#define EM_IA_64 50 /* Intel Merced */
+#define EM_X86_64 62 /* AMD x86-64 architecture */
+#define EM_AARCH64 183 /* ARM AARCH64 */
+#define EM_ALPHA 0x9026
+
+#define EF_MIPS_ABI2 32
+#define EF_MIPS_ABI_ON32 64
+/*
+E_MIPS_ABI_O32 = 0x00001000
+E_MIPS_ABI_O64 = 0x00002000
+E_MIPS_ABI_EABI32 = 0x00003000
+E_MIPS_ABI_EABI64 = 0x00004000
+*/
+
+#define EF_ARM_NEW_ABI 0x80
+#define EF_ARM_OLD_ABI 0x100
+
+
+/*
+def compute_suffix_mips(elf_header):
+ name = None
+ mips_abi = elf_header.e_flags & EF_MIPS_ABI
+ if mips_abi:
+ if mips_abi == E_MIPS_ABI_O32:
+ name = "o32"
+ elif mips_abi == E_MIPS_ABI_O64:
+ name = "o64"
+ elif mips_abi == E_MIPS_ABI_EABI32:
+ name = "eabi32"
+ elif mips_abi == E_MIPS_ABI_EABI64:
+ name = "eabi64"
+
+ elif elf_header.e_flags & EF_MIPS_ABI2:
+ name = "n32"
+ elif elf_header.ei_class == ELFCLASS64:
+ name = "n64"
+
+ return name
+
+def compute_multilib_id(elf_header):
+ prefix = machine_prefix_map.get(elf_header.e_machine)
+ suffix = None
+
+ if prefix == "mips":
+ suffix = compute_suffix_mips(elf_header)
+ elif elf_header.ei_class == ELFCLASS64:
+ suffix = "64"
+ elif elf_header.ei_class == ELFCLASS32:
+ if elf_header.e_machine == EM_X86_64:
+ suffix = "x32"
+ else:
+ suffix = "32"
+
+ if prefix is None or suffix is None:
+ multilib_id = None
+ else:
+ multilib_id = "%s_%s" % (prefix, suffix)
+
+ return multilib_id
+*/
+
+
+#define bswap_16(x) ((uint16_t)((((x) >> 8) & 0xff) | (((x) & 0xff) << 8)))
+
+/*
+#define bswap_32(x) \
+ ((((x) & 0xff000000) >> 24) | (((x) & 0x00ff0000) >> 8) | \
+ (((x) & 0x0000ff00) << 8) | (((x) & 0x000000ff) << 24))
+*/
+
+#define MAX_IDENT 32
+
+int
+main(int argc, char* argv[])
+{
+ char ident[MAX_IDENT]; /* The Gentoo standard arch_abi identifier. */
+ char *arch; /* The Gentoo architecture identifier. */
+ int fd;
+ struct stat s;
+ char magic[4]; /* magic number at the begining of the file */
+ uint8_t ei_class, width; /* width = 8 bytes for 32-bits, 16 bytes for 64-bits. */
+ uint8_t ei_data, endian; /* endian = 0 for little, 1 for big endian. */
+ uint16_t e_machine; /* Size is Elf32_Half or Elf64_Half. Both are 2 bytes. */
+ uint32_t e_flags; /* Size is Elf32_Word or Elf64_Word. Both are 4 bytes. */
+ uint64_t e_flags_offset; /* Wide enough for either 32 or 64 bits. */
+
+ /* Is the second parameter a regular file? */
+ if (argc != 2)
+ errx(1, "Usage: %s <file>", argv[0]);
+ if (stat(argv[1], &s) == -1)
+ errx(1, "%s does not exist", argv[1]);
+ if (!S_ISREG(s.st_mode))
+ errx(1, "%s is not a regular file", argv[1]);
+
+ /* Can we read it and is it an ELF object? */
+ if ((fd = open(argv[1], O_RDONLY)) == -1)
+ err(1, "failed to open %s", argv[1]);
+ if (read(fd, magic, 4) == -1)
+ err(1, "read() magic failed");
+ if (strncmp(magic, ELFMAG, 4) != 0)
+ errx(1, "%s is not an ELF object", argv[1]);
+
+
+ /* 32 or 64 bits? */
+ if (read(fd, &ei_class, 1) == -1)
+ err(1, "read() ei_class failed");
+ switch (ei_class) {
+ case ELFCLASS32:
+ width = 4;
+ printf("32 bit\n");
+ break;
+ case ELFCLASS64:
+ width = 8;
+ printf("64 bit\n");
+ break;
+ default:
+ width = 0;
+ printf("Unknown bit\n");
+ }
+
+ /* Little or Big Endian */
+ if (read(fd, &ei_data, 1) == -1)
+ err(1, "read() ei_data failed");
+ switch (ei_data) {
+ case ELFDATA2LSB:
+ endian = 0;
+ printf("Little Endian\n");
+ break;
+ case ELFDATA2MSB:
+ endian = 1;
+ printf("Big Endian\n");
+ break;
+ default:
+ endian = -1;
+ printf("Unknown Endian\n");
+ }
+
+ /* seek to e_macine = 16 bytes (e_ident[])) + 2 bytes (e_type which is Elf32_Half/Elf64_Half) */
+ if (lseek(fd, 18, SEEK_SET) == -1)
+ err(1, "lseek() e_machine failed");
+
+ /* What is the arch? */
+ if (read(fd, &e_machine, 2) == -1)
+ err(1, "read() e_machine failed");
+ //if (endian == 0)
+ // e_machine = bswap_16(e_machine);
+ printf("Machine =%d\n", e_machine);
+
+ switch(e_machine) {
+ case EM_ALPHA:
+ case EM_FAKE_ALPHA:
+ arch = "alpha";
+ break;
+ case EM_X86_64:
+ arch = "amd64";
+ break;
+ case EM_ARM:
+ arch = "arm";
+ break;
+ case EM_AARCH64:
+ arch = "arm64";
+ break;
+ case EM_68K:
+ arch = "m68k";
+ break;
+ case EM_MIPS_RS3_LE:
+ case EM_MIPS:
+ arch = "mips";
+ break;
+ case EM_IA_64:
+ arch = "ia64";
+ break;
+ case EM_PARISC:
+ arch = "hppa";
+ break;
+ case EM_PPC:
+ arch = "ppc";
+ break;
+ case EM_PPC64:
+ arch = "ppc64";
+ break;
+ case EM_S390:
+ arch = "s390";
+ break;
+ case EM_SH:
+ arch = "sh";
+ break;
+ case EM_SPARC32PLUS:
+ case EM_SPARCV9:
+ case EM_SPARC:
+ arch = "sparc";
+ break;
+ case EM_386:
+ arch = "x86";
+ break;
+ default:
+ arch = "unknown";
+ }
+
+ printf("%s\n", arch);
+
+
+ /*
+ e_data_offset =
+ if (lseek(fd, 18, SEEK_SET) == -1)
+ err(1, "lseek() e_machine failed");
+ if (read(fd, &e_flags, 2) == -1)
+ err(1, "read() e_machine failed");
+ */
+
+ memset(ident, 0, MAX_IDENT);
+
+ close(fd);
+ exit(EXIT_SUCCESS);
+}
+
+/*
+ # E_ENTRY + 3 * sizeof(uintN)
+ e_flags_offset = E_ENTRY + 3 * width // 8
+ f.seek(e_flags_offset)
+ e_flags = uint32(f.read(4))
+
+ return _elf_header(ei_class, ei_data, e_machine, e_flags)
+
+ multilib_id = compute_multilib_id(elf_header)
+*/
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [gentoo-commits] proj/elfix:master commit in: misc/elf-abi/
@ 2015-01-03 23:49 Anthony G. Basile
0 siblings, 0 replies; 11+ messages in thread
From: Anthony G. Basile @ 2015-01-03 23:49 UTC (permalink / raw
To: gentoo-commits
commit: 244969d6eaa011c87bcba5d1f982d546de715f08
Author: Anthony G. Basile <blueness <AT> gentoo <DOT> org>
AuthorDate: Sat Jan 3 23:50:11 2015 +0000
Commit: Anthony G. Basile <blueness <AT> gentoo <DOT> org>
CommitDate: Sat Jan 3 23:50:11 2015 +0000
URL: http://sources.gentoo.org/gitweb/?p=proj/elfix.git;a=commit;h=244969d6
misc/elf-abi: read() gets the correct endian order
---
misc/elf-abi/elf-abi.c | 37 ++++++++++---------------------------
1 file changed, 10 insertions(+), 27 deletions(-)
diff --git a/misc/elf-abi/elf-abi.c b/misc/elf-abi/elf-abi.c
index 589d458..32e3851 100644
--- a/misc/elf-abi/elf-abi.c
+++ b/misc/elf-abi/elf-abi.c
@@ -103,7 +103,6 @@ E_MIPS_ABI_EABI64 = 0x00004000
#define EF_ARM_NEW_ABI 0x80
#define EF_ARM_OLD_ABI 0x100
-
/*
def compute_suffix_mips(elf_header):
name = None
@@ -147,15 +146,6 @@ def compute_multilib_id(elf_header):
return multilib_id
*/
-
-#define bswap_16(x) ((uint16_t)((((x) >> 8) & 0xff) | (((x) & 0xff) << 8)))
-
-/*
-#define bswap_32(x) \
- ((((x) & 0xff000000) >> 24) | (((x) & 0x00ff0000) >> 8) | \
- (((x) & 0x0000ff00) << 8) | (((x) & 0x000000ff) << 24))
-*/
-
#define MAX_IDENT 32
int
@@ -206,7 +196,7 @@ main(int argc, char* argv[])
printf("Unknown bit\n");
}
- /* Little or Big Endian */
+ /* Little or Big Endian? */
if (read(fd, &ei_data, 1) == -1)
err(1, "read() ei_data failed");
switch (ei_data) {
@@ -223,17 +213,13 @@ main(int argc, char* argv[])
printf("Unknown Endian\n");
}
- /* seek to e_macine = 16 bytes (e_ident[])) + 2 bytes (e_type which is Elf32_Half/Elf64_Half) */
+ /* Seek to e_macine = 16 bytes (e_ident[])) + 2 bytes (e_type which is Elf32_Half/Elf64_Half) */
if (lseek(fd, 18, SEEK_SET) == -1)
err(1, "lseek() e_machine failed");
/* What is the arch? */
if (read(fd, &e_machine, 2) == -1)
err(1, "read() e_machine failed");
- //if (endian == 0)
- // e_machine = bswap_16(e_machine);
- printf("Machine =%d\n", e_machine);
-
switch(e_machine) {
case EM_ALPHA:
case EM_FAKE_ALPHA:
@@ -284,10 +270,8 @@ main(int argc, char* argv[])
default:
arch = "unknown";
}
-
printf("%s\n", arch);
-
/*
e_data_offset =
if (lseek(fd, 18, SEEK_SET) == -1)
@@ -295,14 +279,7 @@ main(int argc, char* argv[])
if (read(fd, &e_flags, 2) == -1)
err(1, "read() e_machine failed");
*/
-
- memset(ident, 0, MAX_IDENT);
-
- close(fd);
- exit(EXIT_SUCCESS);
-}
-
-/*
+ /*
# E_ENTRY + 3 * sizeof(uintN)
e_flags_offset = E_ENTRY + 3 * width // 8
f.seek(e_flags_offset)
@@ -311,4 +288,10 @@ main(int argc, char* argv[])
return _elf_header(ei_class, ei_data, e_machine, e_flags)
multilib_id = compute_multilib_id(elf_header)
-*/
+ */
+
+ memset(ident, 0, MAX_IDENT);
+
+ close(fd);
+ exit(EXIT_SUCCESS);
+}
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [gentoo-commits] proj/elfix:master commit in: misc/elf-abi/
@ 2015-01-03 23:53 Anthony G. Basile
0 siblings, 0 replies; 11+ messages in thread
From: Anthony G. Basile @ 2015-01-03 23:53 UTC (permalink / raw
To: gentoo-commits
commit: 55440d11bbf3fd36388ab9135d640f66bd4d1ce9
Author: Anthony G. Basile <blueness <AT> gentoo <DOT> org>
AuthorDate: Sat Jan 3 23:50:11 2015 +0000
Commit: Anthony G. Basile <blueness <AT> gentoo <DOT> org>
CommitDate: Sat Jan 3 23:53:43 2015 +0000
URL: http://sources.gentoo.org/gitweb/?p=proj/elfix.git;a=commit;h=55440d11
misc/elf-abi: read() gets the correct endian order
---
misc/elf-abi/elf-abi.c | 38 ++++++++++----------------------------
1 file changed, 10 insertions(+), 28 deletions(-)
diff --git a/misc/elf-abi/elf-abi.c b/misc/elf-abi/elf-abi.c
index 589d458..aa383c4 100644
--- a/misc/elf-abi/elf-abi.c
+++ b/misc/elf-abi/elf-abi.c
@@ -62,7 +62,6 @@
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
-#include <endian.h>
/* We steal this from <elf.h> but don't include it so as to not increase our dependancies. */
#define ELFMAG "\177ELF"
@@ -103,7 +102,6 @@ E_MIPS_ABI_EABI64 = 0x00004000
#define EF_ARM_NEW_ABI 0x80
#define EF_ARM_OLD_ABI 0x100
-
/*
def compute_suffix_mips(elf_header):
name = None
@@ -147,15 +145,6 @@ def compute_multilib_id(elf_header):
return multilib_id
*/
-
-#define bswap_16(x) ((uint16_t)((((x) >> 8) & 0xff) | (((x) & 0xff) << 8)))
-
-/*
-#define bswap_32(x) \
- ((((x) & 0xff000000) >> 24) | (((x) & 0x00ff0000) >> 8) | \
- (((x) & 0x0000ff00) << 8) | (((x) & 0x000000ff) << 24))
-*/
-
#define MAX_IDENT 32
int
@@ -206,7 +195,7 @@ main(int argc, char* argv[])
printf("Unknown bit\n");
}
- /* Little or Big Endian */
+ /* Little or Big Endian? */
if (read(fd, &ei_data, 1) == -1)
err(1, "read() ei_data failed");
switch (ei_data) {
@@ -223,17 +212,13 @@ main(int argc, char* argv[])
printf("Unknown Endian\n");
}
- /* seek to e_macine = 16 bytes (e_ident[])) + 2 bytes (e_type which is Elf32_Half/Elf64_Half) */
+ /* Seek to e_macine = 16 bytes (e_ident[])) + 2 bytes (e_type which is Elf32_Half/Elf64_Half) */
if (lseek(fd, 18, SEEK_SET) == -1)
err(1, "lseek() e_machine failed");
/* What is the arch? */
if (read(fd, &e_machine, 2) == -1)
err(1, "read() e_machine failed");
- //if (endian == 0)
- // e_machine = bswap_16(e_machine);
- printf("Machine =%d\n", e_machine);
-
switch(e_machine) {
case EM_ALPHA:
case EM_FAKE_ALPHA:
@@ -284,10 +269,8 @@ main(int argc, char* argv[])
default:
arch = "unknown";
}
-
printf("%s\n", arch);
-
/*
e_data_offset =
if (lseek(fd, 18, SEEK_SET) == -1)
@@ -295,14 +278,7 @@ main(int argc, char* argv[])
if (read(fd, &e_flags, 2) == -1)
err(1, "read() e_machine failed");
*/
-
- memset(ident, 0, MAX_IDENT);
-
- close(fd);
- exit(EXIT_SUCCESS);
-}
-
-/*
+ /*
# E_ENTRY + 3 * sizeof(uintN)
e_flags_offset = E_ENTRY + 3 * width // 8
f.seek(e_flags_offset)
@@ -311,4 +287,10 @@ main(int argc, char* argv[])
return _elf_header(ei_class, ei_data, e_machine, e_flags)
multilib_id = compute_multilib_id(elf_header)
-*/
+ */
+
+ memset(ident, 0, MAX_IDENT);
+
+ close(fd);
+ exit(EXIT_SUCCESS);
+}
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [gentoo-commits] proj/elfix:master commit in: misc/elf-abi/
@ 2015-01-05 16:23 Anthony G. Basile
0 siblings, 0 replies; 11+ messages in thread
From: Anthony G. Basile @ 2015-01-05 16:23 UTC (permalink / raw
To: gentoo-commits
commit: c7217fa43806228ff46af1e21242ce4dd82a06a6
Author: Anthony G. Basile <blueness <AT> gentoo <DOT> org>
AuthorDate: Mon Jan 5 16:24:44 2015 +0000
Commit: Anthony G. Basile <blueness <AT> gentoo <DOT> org>
CommitDate: Mon Jan 5 16:24:44 2015 +0000
URL: http://sources.gentoo.org/gitweb/?p=proj/elfix.git;a=commit;h=c7217fa4
misc/elf-abi: code cleanup
---
misc/elf-abi/elf-abi.c | 281 +++++++++++++++++++++++--------------------------
1 file changed, 130 insertions(+), 151 deletions(-)
diff --git a/misc/elf-abi/elf-abi.c b/misc/elf-abi/elf-abi.c
index aa383c4..6b3a9c2 100644
--- a/misc/elf-abi/elf-abi.c
+++ b/misc/elf-abi/elf-abi.c
@@ -7,15 +7,15 @@
*
* Supported identifiers:
*
- * alpha_32
- * arm_{oabi32,32,64}
- * hppa_32,64
- * ia_64
- * m68k_32
+ * alpha_{32,64}
+ * arm_{32,64}
+ * hppa_{32,64}
+ * ia_{32,64}
+ * m68k_{32,64}
* mips_{n32,n64,o32}
* ppc_{32,64}
- * s390_32
- * sh_32
+ * s390_{32,64}
+ * sh_{32,64}
* sparc_{32,64}
* x86_{32,x32,64}
*
@@ -35,7 +35,6 @@
*
* http://www.sco.com/developers/gabi/2000-07-17/ch4.eheader.html
*
- *
* Copyright 2015 Anthony G. Basile - <blueness@gentoo.org>
* Copyright 2015 Zac Medico - <zmedico@gentoo.org>
*
@@ -102,64 +101,91 @@ E_MIPS_ABI_EABI64 = 0x00004000
#define EF_ARM_NEW_ABI 0x80
#define EF_ARM_OLD_ABI 0x100
-/*
-def compute_suffix_mips(elf_header):
- name = None
- mips_abi = elf_header.e_flags & EF_MIPS_ABI
- if mips_abi:
- if mips_abi == E_MIPS_ABI_O32:
- name = "o32"
- elif mips_abi == E_MIPS_ABI_O64:
- name = "o64"
- elif mips_abi == E_MIPS_ABI_EABI32:
- name = "eabi32"
- elif mips_abi == E_MIPS_ABI_EABI64:
- name = "eabi64"
-
- elif elf_header.e_flags & EF_MIPS_ABI2:
- name = "n32"
- elif elf_header.ei_class == ELFCLASS64:
- name = "n64"
- return name
-
-def compute_multilib_id(elf_header):
- prefix = machine_prefix_map.get(elf_header.e_machine)
- suffix = None
+int
+get_wordsize(uint8_t ei_class)
+{
+ switch (ei_class) {
+ case ELFCLASS32:
+ return 32;
+ case ELFCLASS64:
+ return 64;
+ default:
+ return 0;
+ }
+}
- if prefix == "mips":
- suffix = compute_suffix_mips(elf_header)
- elif elf_header.ei_class == ELFCLASS64:
- suffix = "64"
- elif elf_header.ei_class == ELFCLASS32:
- if elf_header.e_machine == EM_X86_64:
- suffix = "x32"
- else:
- suffix = "32"
- if prefix is None or suffix is None:
- multilib_id = None
- else:
- multilib_id = "%s_%s" % (prefix, suffix)
+int
+get_endian(uint8_t ei_data)
+{
+ switch (ei_data) {
+ case ELFDATA2LSB:
+ return -1;
+ case ELFDATA2MSB:
+ return 1;
+ default:
+ return 0;
+ }
+}
- return multilib_id
-*/
-#define MAX_IDENT 32
+char *
+get_abi(uint16_t e_machine, int width, uint32_t e_flags)
+{
+ switch(e_machine) {
+ case EM_ALPHA:
+ case EM_FAKE_ALPHA:
+ return "alpha";
+ case EM_X86_64:
+ return "amd64";
+ case EM_ARM:
+ return "arm";
+ case EM_AARCH64:
+ return "arm64";
+ case EM_68K:
+ return "m68k";
+ case EM_MIPS_RS3_LE:
+ case EM_MIPS:
+ return "mips";
+ case EM_IA_64:
+ return "ia64";
+ case EM_PARISC:
+ return "hppa";
+ case EM_PPC:
+ return "ppc";
+ case EM_PPC64:
+ return "ppc64";
+ case EM_S390:
+ return "s390";
+ case EM_SH:
+ return "sh";
+ case EM_SPARC32PLUS:
+ case EM_SPARCV9:
+ case EM_SPARC:
+ return "sparc";
+ case EM_386:
+ return "x86";
+ default:
+ return "unknown_arch";
+ }
+}
int
main(int argc, char* argv[])
{
- char ident[MAX_IDENT]; /* The Gentoo standard arch_abi identifier. */
- char *arch; /* The Gentoo architecture identifier. */
- int fd;
- struct stat s;
+ int width; /* Machine word size. Either 32 or 64 bits. */
+ int endian; /* Endian, -1 = little, 1 = big */
+ char *abi; /* Abi name from glibc's <bits/syscall.h> */
+
+ int fd; /* file descriptor for opened Elf object. */
+ struct stat s; /* stat on opened Elf object. */
char magic[4]; /* magic number at the begining of the file */
- uint8_t ei_class, width; /* width = 8 bytes for 32-bits, 16 bytes for 64-bits. */
- uint8_t ei_data, endian; /* endian = 0 for little, 1 for big endian. */
+ uint8_t ei_class; /* ei_class is one byte of e_ident[] */
+ uint8_t ei_data; /* ei_data is one byte of e_ident[] */
uint16_t e_machine; /* Size is Elf32_Half or Elf64_Half. Both are 2 bytes. */
uint32_t e_flags; /* Size is Elf32_Word or Elf64_Word. Both are 4 bytes. */
- uint64_t e_flags_offset; /* Wide enough for either 32 or 64 bits. */
+ uint64_t e_machine_offset, e_flags_offset; /* Wide enough for either 32 or 64 bits. */
/* Is the second parameter a regular file? */
if (argc != 2)
@@ -177,120 +203,73 @@ main(int argc, char* argv[])
if (strncmp(magic, ELFMAG, 4) != 0)
errx(1, "%s is not an ELF object", argv[1]);
-
/* 32 or 64 bits? */
if (read(fd, &ei_class, 1) == -1)
err(1, "read() ei_class failed");
- switch (ei_class) {
- case ELFCLASS32:
- width = 4;
- printf("32 bit\n");
- break;
- case ELFCLASS64:
- width = 8;
- printf("64 bit\n");
- break;
- default:
- width = 0;
- printf("Unknown bit\n");
- }
+ width = get_wordsize(ei_class);
/* Little or Big Endian? */
if (read(fd, &ei_data, 1) == -1)
err(1, "read() ei_data failed");
- switch (ei_data) {
- case ELFDATA2LSB:
- endian = 0;
- printf("Little Endian\n");
- break;
- case ELFDATA2MSB:
- endian = 1;
- printf("Big Endian\n");
- break;
- default:
- endian = -1;
- printf("Unknown Endian\n");
- }
+ endian = get_endian(ei_data);
- /* Seek to e_macine = 16 bytes (e_ident[])) + 2 bytes (e_type which is Elf32_Half/Elf64_Half) */
- if (lseek(fd, 18, SEEK_SET) == -1)
- err(1, "lseek() e_machine failed");
+ /*
+ All Elf files begin with the following Elf header:
+ unsigned char e_ident[EI_NIDENT]; - 16 bytes
+ Elf32_Half e_type; - 2 bytes
+ Elf32_Half e_machine; - 2 bytes
+ Elf32_Word e_version; - 4 bytes
+ Elf32_Addr e_entry; - 4 bytes or 8 bytes for Elf64
+ Elf32_Off e_phoff; - 4 bytes or 8 bytes for Elf64
+ Elf32_Off e_shoff; - 4 bytes or 8 bytes for Elf64
+ Elf32_Word e_flags; - 4 bytes
+
+ Seek to e_machine = 18 bytes.
+ Seek to e_flags = 36 bytes (Elf32) or 48 bytes (Elf64)
+ */
+ e_machine_offset = 18;
+ if (width == 32)
+ e_flags_offset = 36;
+ else
+ e_flags_offset = 48;
- /* What is the arch? */
+ /* What is the abi? */
+ if (lseek(fd, e_machine_offset, SEEK_SET) == -1)
+ err(1, "lseek() e_machine failed");
if (read(fd, &e_machine, 2) == -1)
err(1, "read() e_machine failed");
- switch(e_machine) {
- case EM_ALPHA:
- case EM_FAKE_ALPHA:
- arch = "alpha";
- break;
- case EM_X86_64:
- arch = "amd64";
- break;
- case EM_ARM:
- arch = "arm";
- break;
- case EM_AARCH64:
- arch = "arm64";
- break;
- case EM_68K:
- arch = "m68k";
- break;
- case EM_MIPS_RS3_LE:
- case EM_MIPS:
- arch = "mips";
- break;
- case EM_IA_64:
- arch = "ia64";
- break;
- case EM_PARISC:
- arch = "hppa";
- break;
- case EM_PPC:
- arch = "ppc";
- break;
- case EM_PPC64:
- arch = "ppc64";
- break;
- case EM_S390:
- arch = "s390";
- break;
- case EM_SH:
- arch = "sh";
- break;
- case EM_SPARC32PLUS:
- case EM_SPARCV9:
- case EM_SPARC:
- arch = "sparc";
- break;
- case EM_386:
- arch = "x86";
- break;
- default:
- arch = "unknown";
- }
- printf("%s\n", arch);
- /*
- e_data_offset =
- if (lseek(fd, 18, SEEK_SET) == -1)
- err(1, "lseek() e_machine failed");
+ if (lseek(fd, e_flags_offset, SEEK_SET) == -1)
+ err(1, "lseek() e_flags failed");
if (read(fd, &e_flags, 2) == -1)
- err(1, "read() e_machine failed");
- */
- /*
- # E_ENTRY + 3 * sizeof(uintN)
- e_flags_offset = E_ENTRY + 3 * width // 8
- f.seek(e_flags_offset)
- e_flags = uint32(f.read(4))
+ err(1, "read() e_flags failed");
- return _elf_header(ei_class, ei_data, e_machine, e_flags)
+ abi = get_abi(e_machine, width, e_flags);
- multilib_id = compute_multilib_id(elf_header)
- */
+ printf("%s\n", abi);
- memset(ident, 0, MAX_IDENT);
+/*
+ if (!strcmp(arch, "mips")) ;
+ switch (e_flags & EF_MIPS_ABI) {
+ case E_MIPS_ABI_O32:
+ abi = "o32";
+ break;
+
+ if mips_abi == E_MIPS_ABI_O32:
+ name = "o32"
+ elif mips_abi == E_MIPS_ABI_O64:
+ name = "o64"
+ elif mips_abi == E_MIPS_ABI_EABI32:
+ name = "eabi32"
+ elif mips_abi == E_MIPS_ABI_EABI64:
+ name = "eabi64"
+ elif elf_header.e_flags & EF_MIPS_ABI2:
+ name = "n32"
+ elif elf_header.ei_class == ELFCLASS64:
+ name = "n64"
+ }
+*/
close(fd);
exit(EXIT_SUCCESS);
}
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [gentoo-commits] proj/elfix:master commit in: misc/elf-abi/
@ 2015-01-05 16:26 Anthony G. Basile
0 siblings, 0 replies; 11+ messages in thread
From: Anthony G. Basile @ 2015-01-05 16:26 UTC (permalink / raw
To: gentoo-commits
commit: 710cbb8d24db7bbc64af06921ba281b752e5ef99
Author: Anthony G. Basile <blueness <AT> gentoo <DOT> org>
AuthorDate: Mon Jan 5 16:27:26 2015 +0000
Commit: Anthony G. Basile <blueness <AT> gentoo <DOT> org>
CommitDate: Mon Jan 5 16:27:26 2015 +0000
URL: http://sources.gentoo.org/gitweb/?p=proj/elfix.git;a=commit;h=710cbb8d
misc/elf-abi: remove endian code
---
misc/elf-abi/elf-abi.c | 23 -----------------------
1 file changed, 23 deletions(-)
diff --git a/misc/elf-abi/elf-abi.c b/misc/elf-abi/elf-abi.c
index 6b3a9c2..0a271ba 100644
--- a/misc/elf-abi/elf-abi.c
+++ b/misc/elf-abi/elf-abi.c
@@ -67,8 +67,6 @@
#define ELFCLASS32 1 /* 32-bit objects */
#define ELFCLASS64 2 /* 64-bit objects */
-#define ELFDATA2LSB 1 /* 2's complement, little endian */
-#define ELFDATA2MSB 2 /* 2's complement, big endian */
#define EM_SPARC 2 /* SUN SPARC */
#define EM_386 3 /* Intel 80386 */
@@ -116,20 +114,6 @@ get_wordsize(uint8_t ei_class)
}
-int
-get_endian(uint8_t ei_data)
-{
- switch (ei_data) {
- case ELFDATA2LSB:
- return -1;
- case ELFDATA2MSB:
- return 1;
- default:
- return 0;
- }
-}
-
-
char *
get_abi(uint16_t e_machine, int width, uint32_t e_flags)
{
@@ -175,14 +159,12 @@ int
main(int argc, char* argv[])
{
int width; /* Machine word size. Either 32 or 64 bits. */
- int endian; /* Endian, -1 = little, 1 = big */
char *abi; /* Abi name from glibc's <bits/syscall.h> */
int fd; /* file descriptor for opened Elf object. */
struct stat s; /* stat on opened Elf object. */
char magic[4]; /* magic number at the begining of the file */
uint8_t ei_class; /* ei_class is one byte of e_ident[] */
- uint8_t ei_data; /* ei_data is one byte of e_ident[] */
uint16_t e_machine; /* Size is Elf32_Half or Elf64_Half. Both are 2 bytes. */
uint32_t e_flags; /* Size is Elf32_Word or Elf64_Word. Both are 4 bytes. */
uint64_t e_machine_offset, e_flags_offset; /* Wide enough for either 32 or 64 bits. */
@@ -208,11 +190,6 @@ main(int argc, char* argv[])
err(1, "read() ei_class failed");
width = get_wordsize(ei_class);
- /* Little or Big Endian? */
- if (read(fd, &ei_data, 1) == -1)
- err(1, "read() ei_data failed");
- endian = get_endian(ei_data);
-
/*
All Elf files begin with the following Elf header:
unsigned char e_ident[EI_NIDENT]; - 16 bytes
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [gentoo-commits] proj/elfix:master commit in: misc/elf-abi/
@ 2015-01-06 15:13 Anthony G. Basile
0 siblings, 0 replies; 11+ messages in thread
From: Anthony G. Basile @ 2015-01-06 15:13 UTC (permalink / raw
To: gentoo-commits
commit: c51a1996485f2836677d1a829e314e2a1fd85327
Author: Anthony G. Basile <blueness <AT> gentoo <DOT> org>
AuthorDate: Tue Jan 6 15:14:56 2015 +0000
Commit: Anthony G. Basile <blueness <AT> gentoo <DOT> org>
CommitDate: Tue Jan 6 15:14:56 2015 +0000
URL: http://sources.gentoo.org/gitweb/?p=proj/elfix.git;a=commit;h=c51a1996
misc/elf-abi: add logic for mips abis
---
misc/elf-abi/elf-abi.c | 147 ++++++++++++++++++++++++++++---------------------
1 file changed, 85 insertions(+), 62 deletions(-)
diff --git a/misc/elf-abi/elf-abi.c b/misc/elf-abi/elf-abi.c
index 0a271ba..fb53391 100644
--- a/misc/elf-abi/elf-abi.c
+++ b/misc/elf-abi/elf-abi.c
@@ -7,25 +7,21 @@
*
* Supported identifiers:
*
- * alpha_{32,64}
- * arm_{32,64}
- * hppa_{32,64}
- * ia_{32,64}
- * m68k_{32,64}
+ * alpha_64
+ * arm_{oabi,eabi}
+ * arm_64
+ * hppa_32
+ * ia_64
+ * m68k_32
* mips_{n32,n64,o32}
* ppc_{32,64}
* s390_{32,64}
- * sh_{32,64}
+ * sh_32
* sparc_{32,64}
* x86_{32,x32,64}
*
* NOTES:
*
- * * The ABIs referenced by some of the above *_32 and *_64 identifiers
- * may be imaginary, but they are listed anyway, since the goal is to
- * establish a naming convention that is as consistent and uniform as
- * possible.
- *
* * The Elf header's e_ident[EI_OSABI] byte is completely ignored,
* since OS-independence is one of the goals. The assumption is that,
* for given installation, we are only interested in tracking multilib
@@ -85,19 +81,13 @@
#define EM_IA_64 50 /* Intel Merced */
#define EM_X86_64 62 /* AMD x86-64 architecture */
#define EM_AARCH64 183 /* ARM AARCH64 */
-#define EM_ALPHA 0x9026
+#define EM_ALPHA 0x9026 /* Unofficial, but needed in Gentoo */
+#define EM_HPPA 0x0F00 /* Unofficial, but needed in Gentoo */
-#define EF_MIPS_ABI2 32
-#define EF_MIPS_ABI_ON32 64
-/*
-E_MIPS_ABI_O32 = 0x00001000
-E_MIPS_ABI_O64 = 0x00002000
-E_MIPS_ABI_EABI32 = 0x00003000
-E_MIPS_ABI_EABI64 = 0x00004000
-*/
+#define EF_MIPS_ABI 0x0000F000
+#define E_MIPS_ABI_O32 0x00001000
-#define EF_ARM_NEW_ABI 0x80
-#define EF_ARM_OLD_ABI 0x100
+#define EF_ARM_EABIMASK 0XFF000000
int
@@ -117,44 +107,100 @@ get_wordsize(uint8_t ei_class)
char *
get_abi(uint16_t e_machine, int width, uint32_t e_flags)
{
+ /* The following arrives at the abstract ABI name by a process of elimination based on the assumption
+ * that we are only interested in the ABIs supported in Gentoo. If a new ABIs is added, you need to
+ * rethink the logic to avoid false positives/negatives.
+ */
switch(e_machine) {
+
+ /* alpha: We support only one 64-bit ABI. */
case EM_ALPHA:
case EM_FAKE_ALPHA:
- return "alpha";
+ return "alpha_64";
+
+ /* amd64 + x86: We support X86-64, X86-X32, and X86-32 ABI. The first
+ * two are 64-bit ABIs and the third is 32-bit. All three will run on
+ * amd64 architecture, but only the 32-bit will run on the x86 family.
+ */
case EM_X86_64:
- return "amd64";
+ if (width == 64)
+ return "x86_64";
+ else
+ return "x86_x32";
+ case EM_386:
+ return "x86_32";
+
+ /* arm: We support two 32-bit ABIs, eabi and oabi. */
case EM_ARM:
- return "arm";
+ if (e_flags & EF_ARM_EABIMASK)
+ return "arm_eabi";
+ else
+ return "arm_oabi";
+
+ /* arm64: We support only one 64-bit ABI. */
case EM_AARCH64:
- return "arm64";
+ return "arm_64";
+
+ /* m68k: We support only one 32-bit ABI. */
case EM_68K:
- return "m68k";
+ return "m68k_32";
+
+ /* mips: We support o32, n32 and n64. The first is 32-bits and the
+ * latter two are 64-bit ABIs.
+ */
case EM_MIPS_RS3_LE:
case EM_MIPS:
- return "mips";
+ if (width == 64)
+ return "mips_n64";
+ else
+ if ((e_flags & EF_MIPS_ABI) == E_MIPS_ABI_O32)
+ return "mips_o32";
+ else
+ return "mips_n32";
+
+ /* ia64: We support only one 64-bit ABI. */
case EM_IA_64:
- return "ia64";
+ return "ia_64";
+
+ /* hppa: We support only one 32-bit ABI. */
case EM_PARISC:
- return "hppa";
+ case EM_HPPA:
+ return "hppa_32";
+
+ /* ppc: We support only one 32-bit ABI. */
case EM_PPC:
- return "ppc";
+ return "ppc_32";
+
+ /* ppc64: We support only one 64-bit ABI. */
case EM_PPC64:
- return "ppc64";
+ return "ppc_64";
+
+ /* s390: We support one 32-bit and one 64-bit ABI. */
case EM_S390:
- return "s390";
+ if (width == 64)
+ return "s390_64";
+ else
+ return "s390_32";
+
+ /* sh: We support only one 32-bit ABI. */
case EM_SH:
- return "sh";
+ return "sh_32";
+
+ /* sparc: We support one 32-bit and one 64-bit ABI. */
case EM_SPARC32PLUS:
case EM_SPARCV9:
case EM_SPARC:
- return "sparc";
- case EM_386:
- return "x86";
+ if (width == 64)
+ return "sparc_64";
+ else
+ return "sparc_32";
+
default:
- return "unknown_arch";
+ return "unknown";
}
}
+
int
main(int argc, char* argv[])
{
@@ -218,35 +264,12 @@ main(int argc, char* argv[])
if (lseek(fd, e_flags_offset, SEEK_SET) == -1)
err(1, "lseek() e_flags failed");
- if (read(fd, &e_flags, 2) == -1)
+ if (read(fd, &e_flags, 4) == -1)
err(1, "read() e_flags failed");
abi = get_abi(e_machine, width, e_flags);
-
printf("%s\n", abi);
-
-/*
- if (!strcmp(arch, "mips")) ;
- switch (e_flags & EF_MIPS_ABI) {
- case E_MIPS_ABI_O32:
- abi = "o32";
- break;
-
- if mips_abi == E_MIPS_ABI_O32:
- name = "o32"
- elif mips_abi == E_MIPS_ABI_O64:
- name = "o64"
- elif mips_abi == E_MIPS_ABI_EABI32:
- name = "eabi32"
- elif mips_abi == E_MIPS_ABI_EABI64:
- name = "eabi64"
- elif elf_header.e_flags & EF_MIPS_ABI2:
- name = "n32"
- elif elf_header.ei_class == ELFCLASS64:
- name = "n64"
- }
-*/
close(fd);
exit(EXIT_SUCCESS);
}
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [gentoo-commits] proj/elfix:master commit in: misc/elf-abi/
@ 2015-01-06 17:26 Anthony G. Basile
0 siblings, 0 replies; 11+ messages in thread
From: Anthony G. Basile @ 2015-01-06 17:26 UTC (permalink / raw
To: gentoo-commits
commit: 51e620eef945c3af2c2d8c92fedbacb99ba55d3d
Author: Anthony G. Basile <blueness <AT> gentoo <DOT> org>
AuthorDate: Tue Jan 6 17:27:12 2015 +0000
Commit: Anthony G. Basile <blueness <AT> gentoo <DOT> org>
CommitDate: Tue Jan 6 17:27:12 2015 +0000
URL: http://sources.gentoo.org/gitweb/?p=proj/elfix.git;a=commit;h=51e620ee
misc/elf-abi: sort out EM numbers for gentoo -- except mips
---
misc/elf-abi/elf-abi.c | 116 +++++++++++++++++++++++--------------------------
1 file changed, 55 insertions(+), 61 deletions(-)
diff --git a/misc/elf-abi/elf-abi.c b/misc/elf-abi/elf-abi.c
index fb53391..13ec542 100644
--- a/misc/elf-abi/elf-abi.c
+++ b/misc/elf-abi/elf-abi.c
@@ -58,50 +58,38 @@
#include <unistd.h>
#include <fcntl.h>
-/* We steal this from <elf.h> but don't include it so as to not increase our dependancies. */
+/* We reorder the big endian EM_ numbers to avoid also reading endian information from
+ * the Elf file. For a mapping between common macine names and EM_ see <elf.h>. For a
+ * more complete mapping, see elfutil's machines[] defined in libebl/eblopenbackend.c.
+ */
#define ELFMAG "\177ELF"
#define ELFCLASS32 1 /* 32-bit objects */
#define ELFCLASS64 2 /* 64-bit objects */
-#define EM_SPARC 2 /* SUN SPARC */
-#define EM_386 3 /* Intel 80386 */
-#define EM_68K 4 /* Motorola m68k family */
+#define EM_ALPHA 0x9026 /* alpha */
+#define EM_ARM 40 /* arm */
+#define EM_AARCH64 183 /* arm64 */
+#define EM_PARISC_BE 0x0F00 /* hppa - big endian reordering of EM_PARISC = 15 */
+#define EM_IA_64 50 /* ia64 */
+#define EM_68K_BE 0x0400 /* m68k - big endian reordering of EM_68K = 4 */
+
#define EM_MIPS 8 /* MIPS R3000 big-endian */
#define EM_MIPS_RS3_LE 10 /* MIPS R3000 little-endian */
-#define EM_PARISC 15 /* HPPA */
-#define EM_SPARC32PLUS 18 /* Sun's "v8plus" */
-#define EM_PPC 20 /* PowerPC */
-#define EM_PPC64 21 /* PowerPC 64-bit */
-#define EM_S390 22 /* IBM S390 */
-#define EM_ARM 40 /* ARM */
-#define EM_FAKE_ALPHA 41 /* Digital Alpha */
-#define EM_SH 42 /* Hitachi SH */
-#define EM_SPARCV9 43 /* SPARC v9 64-bit */
-#define EM_IA_64 50 /* Intel Merced */
-#define EM_X86_64 62 /* AMD x86-64 architecture */
-#define EM_AARCH64 183 /* ARM AARCH64 */
-#define EM_ALPHA 0x9026 /* Unofficial, but needed in Gentoo */
-#define EM_HPPA 0x0F00 /* Unofficial, but needed in Gentoo */
-#define EF_MIPS_ABI 0x0000F000
-#define E_MIPS_ABI_O32 0x00001000
+#define EM_PPC_BE 0x1400 /* ppc - big endian reordering of EM_PPC = 20 */
+#define EM_PPC64_BE 0x1500 /* ppc64 - bit endian reordering of EM_PPC64 = 21 */
+#define EM_S390_BE 0x1600 /* s390 - big endian reordering of EM_S390 */
+#define EM_SH 42 /* Hitachi SH */
+#define EM_SPARC32_BE 0x1200 /* sparc - big endian reordering of EM_SPARC32PLUS = 18 */
+#define EM_SPARC64_BE 0x2B00 /* sparc - big endian reordinger of EM_SPARCV9 = 43 */
+#define EM_386 3 /* x86 */
+#define EM_X86_64 62 /* amd64 */
-#define EF_ARM_EABIMASK 0XFF000000
-
-
-int
-get_wordsize(uint8_t ei_class)
-{
- switch (ei_class) {
- case ELFCLASS32:
- return 32;
- case ELFCLASS64:
- return 64;
- default:
- return 0;
- }
-}
+/* The arm and mips ABI flags housed in e_flags */
+#define EF_MIPS_ABI 0x0000F000 /* Mask for mips ABI */
+#define E_MIPS_ABI_O32 0x00001000 /* Value for o32 */
+#define EF_ARM_EABIMASK 0XFF000000 /* Mask for arm EABI - we dont' destinguish versions */
char *
@@ -115,21 +103,8 @@ get_abi(uint16_t e_machine, int width, uint32_t e_flags)
/* alpha: We support only one 64-bit ABI. */
case EM_ALPHA:
- case EM_FAKE_ALPHA:
return "alpha_64";
- /* amd64 + x86: We support X86-64, X86-X32, and X86-32 ABI. The first
- * two are 64-bit ABIs and the third is 32-bit. All three will run on
- * amd64 architecture, but only the 32-bit will run on the x86 family.
- */
- case EM_X86_64:
- if (width == 64)
- return "x86_64";
- else
- return "x86_x32";
- case EM_386:
- return "x86_32";
-
/* arm: We support two 32-bit ABIs, eabi and oabi. */
case EM_ARM:
if (e_flags & EF_ARM_EABIMASK)
@@ -142,7 +117,7 @@ get_abi(uint16_t e_machine, int width, uint32_t e_flags)
return "arm_64";
/* m68k: We support only one 32-bit ABI. */
- case EM_68K:
+ case EM_68K_BE:
return "m68k_32";
/* mips: We support o32, n32 and n64. The first is 32-bits and the
@@ -163,20 +138,19 @@ get_abi(uint16_t e_machine, int width, uint32_t e_flags)
return "ia_64";
/* hppa: We support only one 32-bit ABI. */
- case EM_PARISC:
- case EM_HPPA:
+ case EM_PARISC_BE:
return "hppa_32";
/* ppc: We support only one 32-bit ABI. */
- case EM_PPC:
+ case EM_PPC_BE:
return "ppc_32";
/* ppc64: We support only one 64-bit ABI. */
- case EM_PPC64:
+ case EM_PPC64_BE:
return "ppc_64";
/* s390: We support one 32-bit and one 64-bit ABI. */
- case EM_S390:
+ case EM_S390_BE:
if (width == 64)
return "s390_64";
else
@@ -187,13 +161,22 @@ get_abi(uint16_t e_machine, int width, uint32_t e_flags)
return "sh_32";
/* sparc: We support one 32-bit and one 64-bit ABI. */
- case EM_SPARC32PLUS:
- case EM_SPARCV9:
- case EM_SPARC:
+ case EM_SPARC32_BE:
+ return "sparc_32";
+ case EM_SPARC64_BE:
+ return "sparc_64";
+
+ /* amd64 + x86: We support X86-64, X86-X32, and X86-32 ABI. The first
+ * two are 64-bit ABIs and the third is 32-bit. All three will run on
+ * amd64 architecture, but only the 32-bit will run on the x86 family.
+ */
+ case EM_386:
+ return "x86_32";
+ case EM_X86_64:
if (width == 64)
- return "sparc_64";
+ return "x86_64";
else
- return "sparc_32";
+ return "x86_x32";
default:
return "unknown";
@@ -231,10 +214,19 @@ main(int argc, char* argv[])
if (strncmp(magic, ELFMAG, 4) != 0)
errx(1, "%s is not an ELF object", argv[1]);
- /* 32 or 64 bits? */
+ /* 32 or 64 bits machine word size? */
if (read(fd, &ei_class, 1) == -1)
err(1, "read() ei_class failed");
- width = get_wordsize(ei_class);
+ switch (ei_class) {
+ case ELFCLASS32:
+ width = 32;
+ break;
+ case ELFCLASS64:
+ width = 64;
+ break;
+ default:
+ errx(1, "Unknown machine word size.");
+ }
/*
All Elf files begin with the following Elf header:
@@ -261,6 +253,8 @@ main(int argc, char* argv[])
err(1, "lseek() e_machine failed");
if (read(fd, &e_machine, 2) == -1)
err(1, "read() e_machine failed");
+ printf("%x\n", e_machine);
+ printf("%d\n", e_machine);
if (lseek(fd, e_flags_offset, SEEK_SET) == -1)
err(1, "lseek() e_flags failed");
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [gentoo-commits] proj/elfix:master commit in: misc/elf-abi/
@ 2015-01-06 18:22 Anthony G. Basile
0 siblings, 0 replies; 11+ messages in thread
From: Anthony G. Basile @ 2015-01-06 18:22 UTC (permalink / raw
To: gentoo-commits
commit: a306769b5d55e5ee95f206930352de15e760140c
Author: Anthony G. Basile <blueness <AT> gentoo <DOT> org>
AuthorDate: Tue Jan 6 18:23:45 2015 +0000
Commit: Anthony G. Basile <blueness <AT> gentoo <DOT> org>
CommitDate: Tue Jan 6 18:23:45 2015 +0000
URL: http://sources.gentoo.org/gitweb/?p=proj/elfix.git;a=commit;h=a306769b
misc/elf-abi: sort out mips
---
misc/elf-abi/elf-abi.c | 26 ++++++++++++++++----------
1 file changed, 16 insertions(+), 10 deletions(-)
diff --git a/misc/elf-abi/elf-abi.c b/misc/elf-abi/elf-abi.c
index 13ec542..5f47212 100644
--- a/misc/elf-abi/elf-abi.c
+++ b/misc/elf-abi/elf-abi.c
@@ -74,8 +74,8 @@
#define EM_IA_64 50 /* ia64 */
#define EM_68K_BE 0x0400 /* m68k - big endian reordering of EM_68K = 4 */
-#define EM_MIPS 8 /* MIPS R3000 big-endian */
-#define EM_MIPS_RS3_LE 10 /* MIPS R3000 little-endian */
+#define EM_MIPS 8 /* mips */
+#define EM_MIPS_BE 0x800 /* mips - big endian reordering of EM_MIPS = 8 */
#define EM_PPC_BE 0x1400 /* ppc - big endian reordering of EM_PPC = 20 */
#define EM_PPC64_BE 0x1500 /* ppc64 - bit endian reordering of EM_PPC64 = 21 */
@@ -83,12 +83,12 @@
#define EM_SH 42 /* Hitachi SH */
#define EM_SPARC32_BE 0x1200 /* sparc - big endian reordering of EM_SPARC32PLUS = 18 */
#define EM_SPARC64_BE 0x2B00 /* sparc - big endian reordinger of EM_SPARCV9 = 43 */
-#define EM_386 3 /* x86 */
+#define EM_386 3 /* x86 */
#define EM_X86_64 62 /* amd64 */
/* The arm and mips ABI flags housed in e_flags */
-#define EF_MIPS_ABI 0x0000F000 /* Mask for mips ABI */
-#define E_MIPS_ABI_O32 0x00001000 /* Value for o32 */
+#define EF_MIPS_ABI2 0x00000020 /* Mask for mips ABI */
+#define EF_MIPS_ABI2_BE 0x20000000 /* Mask for mips ABI */
#define EF_ARM_EABIMASK 0XFF000000 /* Mask for arm EABI - we dont' destinguish versions */
@@ -123,15 +123,23 @@ get_abi(uint16_t e_machine, int width, uint32_t e_flags)
/* mips: We support o32, n32 and n64. The first is 32-bits and the
* latter two are 64-bit ABIs.
*/
- case EM_MIPS_RS3_LE:
case EM_MIPS:
if (width == 64)
return "mips_n64";
else
- if ((e_flags & EF_MIPS_ABI) == E_MIPS_ABI_O32)
- return "mips_o32";
+ if (e_flags & EF_MIPS_ABI2)
+ return "mips_n32";
else
+ return "mips_o32";
+
+ case EM_MIPS_BE:
+ if (width == 64)
+ return "mips_n64";
+ else
+ if (e_flags & EF_MIPS_ABI2_BE)
return "mips_n32";
+ else
+ return "mips_o32";
/* ia64: We support only one 64-bit ABI. */
case EM_IA_64:
@@ -253,8 +261,6 @@ main(int argc, char* argv[])
err(1, "lseek() e_machine failed");
if (read(fd, &e_machine, 2) == -1)
err(1, "read() e_machine failed");
- printf("%x\n", e_machine);
- printf("%d\n", e_machine);
if (lseek(fd, e_flags_offset, SEEK_SET) == -1)
err(1, "lseek() e_flags failed");
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [gentoo-commits] proj/elfix:master commit in: misc/elf-abi/
@ 2015-01-06 20:47 Anthony G. Basile
0 siblings, 0 replies; 11+ messages in thread
From: Anthony G. Basile @ 2015-01-06 20:47 UTC (permalink / raw
To: gentoo-commits
commit: b92d4495d9ee7661b8c5b75648821291b5f5cbfd
Author: Anthony G. Basile <blueness <AT> gentoo <DOT> org>
AuthorDate: Tue Jan 6 20:43:01 2015 +0000
Commit: Anthony G. Basile <blueness <AT> gentoo <DOT> org>
CommitDate: Tue Jan 6 20:43:01 2015 +0000
URL: http://sources.gentoo.org/gitweb/?p=proj/elfix.git;a=commit;h=b92d4495
misc/elf-abi: manually read little/big endian half or full words
When reading on a native system, read() transparently reads two
byte or four bytes in the correct byte order and returns the correct
value. But if you read() a word in a big endian file from a little
endian system or vice versa, you get the wrong value. We wrap
read() in read_endian() to compensate for this.
---
misc/elf-abi/elf-abi.c | 133 +++++++++++++++++++++++++++++++------------------
1 file changed, 84 insertions(+), 49 deletions(-)
diff --git a/misc/elf-abi/elf-abi.c b/misc/elf-abi/elf-abi.c
index 5f47212..f4408cb 100644
--- a/misc/elf-abi/elf-abi.c
+++ b/misc/elf-abi/elf-abi.c
@@ -58,39 +58,62 @@
#include <unistd.h>
#include <fcntl.h>
-/* We reorder the big endian EM_ numbers to avoid also reading endian information from
- * the Elf file. For a mapping between common macine names and EM_ see <elf.h>. For a
- * more complete mapping, see elfutil's machines[] defined in libebl/eblopenbackend.c.
+/* For a mapping between common macine names and EM_ number see <elf.h>. For a more
+ * complete mapping, see elfutil's machines[] defined in libebl/eblopenbackend.c.
*/
#define ELFMAG "\177ELF"
#define ELFCLASS32 1 /* 32-bit objects */
#define ELFCLASS64 2 /* 64-bit objects */
+#define ELFDATA2LSB 1 /* 2's complement, little endian */
+#define ELFDATA2MSB 2 /* 2's complement, big endian */
#define EM_ALPHA 0x9026 /* alpha */
#define EM_ARM 40 /* arm */
#define EM_AARCH64 183 /* arm64 */
-#define EM_PARISC_BE 0x0F00 /* hppa - big endian reordering of EM_PARISC = 15 */
+#define EM_PARISC 15 /* hppa */
#define EM_IA_64 50 /* ia64 */
-#define EM_68K_BE 0x0400 /* m68k - big endian reordering of EM_68K = 4 */
-
+#define EM_68K 4 /* m68k */
#define EM_MIPS 8 /* mips */
-#define EM_MIPS_BE 0x800 /* mips - big endian reordering of EM_MIPS = 8 */
-
-#define EM_PPC_BE 0x1400 /* ppc - big endian reordering of EM_PPC = 20 */
-#define EM_PPC64_BE 0x1500 /* ppc64 - bit endian reordering of EM_PPC64 = 21 */
-#define EM_S390_BE 0x1600 /* s390 - big endian reordering of EM_S390 */
+#define EM_PPC 20 /* ppc */
+#define EM_PPC64 21 /* ppc64 */
+#define EM_S390 22 /* s390 */
#define EM_SH 42 /* Hitachi SH */
-#define EM_SPARC32_BE 0x1200 /* sparc - big endian reordering of EM_SPARC32PLUS = 18 */
-#define EM_SPARC64_BE 0x2B00 /* sparc - big endian reordinger of EM_SPARCV9 = 43 */
+#define EM_SPARC32PLUS 18 /* sparc 32-bit */
+#define EM_SPARCV9 43 /* sparc 64-bit */
#define EM_386 3 /* x86 */
#define EM_X86_64 62 /* amd64 */
/* The arm and mips ABI flags housed in e_flags */
-#define EF_MIPS_ABI2 0x00000020 /* Mask for mips ABI */
-#define EF_MIPS_ABI2_BE 0x20000000 /* Mask for mips ABI */
+#define EF_MIPS_ABI2 0x00000020 /* Mask for mips n32 ABI */
#define EF_ARM_EABIMASK 0XFF000000 /* Mask for arm EABI - we dont' destinguish versions */
+int
+get_wordsize(uint8_t ei_class)
+{
+ switch (ei_class) {
+ case ELFCLASS32:
+ return 32;
+ case ELFCLASS64:
+ return 64;
+ default:
+ errx(1, "Unknown machine word size.");
+ }
+}
+
+int
+get_endian(uint8_t ei_data)
+{
+ switch (ei_data) {
+ case ELFDATA2LSB:
+ return 0;
+ case ELFDATA2MSB:
+ return 1;
+ default:
+ errx(1, "Unknown endian.");
+ }
+}
+
char *
get_abi(uint16_t e_machine, int width, uint32_t e_flags)
@@ -117,7 +140,7 @@ get_abi(uint16_t e_machine, int width, uint32_t e_flags)
return "arm_64";
/* m68k: We support only one 32-bit ABI. */
- case EM_68K_BE:
+ case EM_68K:
return "m68k_32";
/* mips: We support o32, n32 and n64. The first is 32-bits and the
@@ -132,33 +155,25 @@ get_abi(uint16_t e_machine, int width, uint32_t e_flags)
else
return "mips_o32";
- case EM_MIPS_BE:
- if (width == 64)
- return "mips_n64";
- else
- if (e_flags & EF_MIPS_ABI2_BE)
- return "mips_n32";
- else
- return "mips_o32";
/* ia64: We support only one 64-bit ABI. */
case EM_IA_64:
return "ia_64";
/* hppa: We support only one 32-bit ABI. */
- case EM_PARISC_BE:
+ case EM_PARISC:
return "hppa_32";
/* ppc: We support only one 32-bit ABI. */
- case EM_PPC_BE:
+ case EM_PPC:
return "ppc_32";
/* ppc64: We support only one 64-bit ABI. */
- case EM_PPC64_BE:
+ case EM_PPC64:
return "ppc_64";
/* s390: We support one 32-bit and one 64-bit ABI. */
- case EM_S390_BE:
+ case EM_S390:
if (width == 64)
return "s390_64";
else
@@ -169,9 +184,9 @@ get_abi(uint16_t e_machine, int width, uint32_t e_flags)
return "sh_32";
/* sparc: We support one 32-bit and one 64-bit ABI. */
- case EM_SPARC32_BE:
+ case EM_SPARC32PLUS:
return "sparc_32";
- case EM_SPARC64_BE:
+ case EM_SPARCV9:
return "sparc_64";
/* amd64 + x86: We support X86-64, X86-X32, and X86-32 ABI. The first
@@ -192,16 +207,42 @@ get_abi(uint16_t e_machine, int width, uint32_t e_flags)
}
+/* Sublte point about read(): If you run elf-abi from a little endian machine on an */
+/* Elf object on a big endian (eg. if you are cross compiling), then you get the wrong */
+/* byte order. If howerver, you read it natively, you get it right. We'll wrap read() */
+/* with our own version which reads one byte at a time and corrects this. */
+ssize_t
+read_endian(int fd, void *buf, size_t count, int endian)
+{
+ ssize_t i;
+ uint8_t data;
+
+ for(i = 0; i < count; i++) {
+ if (read(fd, &data, 1) == -1)
+ errx(1, "read() ei_class failed");
+ if (endian)
+ ((uint8_t *)buf)[count-i-1] = data;
+ else
+ ((uint8_t *)buf)[i] = data;
+ }
+
+ return count;
+}
+
+
int
main(int argc, char* argv[])
{
int width; /* Machine word size. Either 32 or 64 bits. */
+ int endian; /* Endian, 0 = little, 1 = big */
char *abi; /* Abi name from glibc's <bits/syscall.h> */
int fd; /* file descriptor for opened Elf object. */
struct stat s; /* stat on opened Elf object. */
char magic[4]; /* magic number at the begining of the file */
uint8_t ei_class; /* ei_class is one byte of e_ident[] */
+ uint8_t ei_data; /* ei_data is one byte of e_ident[] */
+
uint16_t e_machine; /* Size is Elf32_Half or Elf64_Half. Both are 2 bytes. */
uint32_t e_flags; /* Size is Elf32_Word or Elf64_Word. Both are 4 bytes. */
uint64_t e_machine_offset, e_flags_offset; /* Wide enough for either 32 or 64 bits. */
@@ -216,25 +257,21 @@ main(int argc, char* argv[])
/* Can we read it and is it an ELF object? */
if ((fd = open(argv[1], O_RDONLY)) == -1)
- err(1, "failed to open %s", argv[1]);
+ errx(1, "failed to open %s", argv[1]);
if (read(fd, magic, 4) == -1)
- err(1, "read() magic failed");
+ errx(1, "read() magic failed");
if (strncmp(magic, ELFMAG, 4) != 0)
errx(1, "%s is not an ELF object", argv[1]);
/* 32 or 64 bits machine word size? */
if (read(fd, &ei_class, 1) == -1)
- err(1, "read() ei_class failed");
- switch (ei_class) {
- case ELFCLASS32:
- width = 32;
- break;
- case ELFCLASS64:
- width = 64;
- break;
- default:
- errx(1, "Unknown machine word size.");
- }
+ errx(1, "read() ei_class failed");
+ width = get_wordsize(ei_class);
+
+ /* Little or Big Endian? */
+ if (read(fd, &ei_data, 1) == -1)
+ errx(1, "read() ei_data failed");
+ endian = get_endian(ei_data);
/*
All Elf files begin with the following Elf header:
@@ -258,14 +295,12 @@ main(int argc, char* argv[])
/* What is the abi? */
if (lseek(fd, e_machine_offset, SEEK_SET) == -1)
- err(1, "lseek() e_machine failed");
- if (read(fd, &e_machine, 2) == -1)
- err(1, "read() e_machine failed");
+ errx(1, "lseek() e_machine failed");
+ read_endian(fd, &e_machine, 2, endian);
if (lseek(fd, e_flags_offset, SEEK_SET) == -1)
- err(1, "lseek() e_flags failed");
- if (read(fd, &e_flags, 4) == -1)
- err(1, "read() e_flags failed");
+ errx(1, "lseek() e_flags failed");
+ read_endian(fd, &e_flags, 4, endian);
abi = get_abi(e_machine, width, e_flags);
printf("%s\n", abi);
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [gentoo-commits] proj/elfix:master commit in: misc/elf-abi/
@ 2015-01-06 21:34 Anthony G. Basile
0 siblings, 0 replies; 11+ messages in thread
From: Anthony G. Basile @ 2015-01-06 21:34 UTC (permalink / raw
To: gentoo-commits
commit: cb2af57d4d0230dbb38f314c24f4118f9dbd679c
Author: Anthony G. Basile <blueness <AT> gentoo <DOT> org>
AuthorDate: Tue Jan 6 21:35:38 2015 +0000
Commit: Anthony G. Basile <blueness <AT> gentoo <DOT> org>
CommitDate: Tue Jan 6 21:35:38 2015 +0000
URL: http://sources.gentoo.org/gitweb/?p=proj/elfix.git;a=commit;h=cb2af57d
misc/elf-abi: fixup read_endian()
---
misc/elf-abi/elf-abi.c | 15 ++++++++-------
1 file changed, 8 insertions(+), 7 deletions(-)
diff --git a/misc/elf-abi/elf-abi.c b/misc/elf-abi/elf-abi.c
index f4408cb..3be6aae 100644
--- a/misc/elf-abi/elf-abi.c
+++ b/misc/elf-abi/elf-abi.c
@@ -211,22 +211,23 @@ get_abi(uint16_t e_machine, int width, uint32_t e_flags)
/* Elf object on a big endian (eg. if you are cross compiling), then you get the wrong */
/* byte order. If howerver, you read it natively, you get it right. We'll wrap read() */
/* with our own version which reads one byte at a time and corrects this. */
-ssize_t
-read_endian(int fd, void *buf, size_t count, int endian)
+uint64_t
+read_endian(int fd, size_t count, int endian)
{
ssize_t i;
uint8_t data;
+ uint64_t value = 0;
for(i = 0; i < count; i++) {
if (read(fd, &data, 1) == -1)
errx(1, "read() ei_class failed");
if (endian)
- ((uint8_t *)buf)[count-i-1] = data;
+ value += data << 8 * (count-i-1);
else
- ((uint8_t *)buf)[i] = data;
+ value += data << 8 * i;
}
- return count;
+ return value;
}
@@ -296,11 +297,11 @@ main(int argc, char* argv[])
/* What is the abi? */
if (lseek(fd, e_machine_offset, SEEK_SET) == -1)
errx(1, "lseek() e_machine failed");
- read_endian(fd, &e_machine, 2, endian);
+ e_machine = (uint16_t)read_endian(fd, 2, endian);
if (lseek(fd, e_flags_offset, SEEK_SET) == -1)
errx(1, "lseek() e_flags failed");
- read_endian(fd, &e_flags, 4, endian);
+ e_flags = (uint32_t)read_endian(fd, 4, endian);
abi = get_abi(e_machine, width, e_flags);
printf("%s\n", abi);
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [gentoo-commits] proj/elfix:master commit in: misc/elf-abi/
@ 2015-01-06 21:43 Anthony G. Basile
0 siblings, 0 replies; 11+ messages in thread
From: Anthony G. Basile @ 2015-01-06 21:43 UTC (permalink / raw
To: gentoo-commits
commit: 666190ea1a94474f73c3e5efcb271432152c6767
Author: Anthony G. Basile <blueness <AT> gentoo <DOT> org>
AuthorDate: Tue Jan 6 21:44:11 2015 +0000
Commit: Anthony G. Basile <blueness <AT> gentoo <DOT> org>
CommitDate: Tue Jan 6 21:44:11 2015 +0000
URL: http://sources.gentoo.org/gitweb/?p=proj/elfix.git;a=commit;h=666190ea
misc/elf-abi.c: cleanup comments
---
misc/elf-abi/elf-abi.c | 15 ++++++++-------
1 file changed, 8 insertions(+), 7 deletions(-)
diff --git a/misc/elf-abi/elf-abi.c b/misc/elf-abi/elf-abi.c
index 3be6aae..81e5e16 100644
--- a/misc/elf-abi/elf-abi.c
+++ b/misc/elf-abi/elf-abi.c
@@ -78,13 +78,12 @@
#define EM_PPC 20 /* ppc */
#define EM_PPC64 21 /* ppc64 */
#define EM_S390 22 /* s390 */
-#define EM_SH 42 /* Hitachi SH */
-#define EM_SPARC32PLUS 18 /* sparc 32-bit */
-#define EM_SPARCV9 43 /* sparc 64-bit */
+#define EM_SH 42 /* sh */
+#define EM_SPARC32PLUS 18 /* sparc (32-bit) */
+#define EM_SPARCV9 43 /* sparc (64-bit) */
#define EM_386 3 /* x86 */
#define EM_X86_64 62 /* amd64 */
-/* The arm and mips ABI flags housed in e_flags */
#define EF_MIPS_ABI2 0x00000020 /* Mask for mips n32 ABI */
#define EF_ARM_EABIMASK 0XFF000000 /* Mask for arm EABI - we dont' destinguish versions */
@@ -218,9 +217,12 @@ read_endian(int fd, size_t count, int endian)
uint8_t data;
uint64_t value = 0;
+ if (count > 8)
+ errx(1, "Max width exceeded in read_endian()");
+
for(i = 0; i < count; i++) {
if (read(fd, &data, 1) == -1)
- errx(1, "read() ei_class failed");
+ errx(1, "read() in read_endian() failed");
if (endian)
value += data << 8 * (count-i-1);
else
@@ -243,7 +245,6 @@ main(int argc, char* argv[])
char magic[4]; /* magic number at the begining of the file */
uint8_t ei_class; /* ei_class is one byte of e_ident[] */
uint8_t ei_data; /* ei_data is one byte of e_ident[] */
-
uint16_t e_machine; /* Size is Elf32_Half or Elf64_Half. Both are 2 bytes. */
uint32_t e_flags; /* Size is Elf32_Word or Elf64_Word. Both are 4 bytes. */
uint64_t e_machine_offset, e_flags_offset; /* Wide enough for either 32 or 64 bits. */
@@ -261,7 +262,7 @@ main(int argc, char* argv[])
errx(1, "failed to open %s", argv[1]);
if (read(fd, magic, 4) == -1)
errx(1, "read() magic failed");
- if (strncmp(magic, ELFMAG, 4) != 0)
+ if (strncmp(magic, ELFMAG, 4))
errx(1, "%s is not an ELF object", argv[1]);
/* 32 or 64 bits machine word size? */
^ permalink raw reply related [flat|nested] 11+ messages in thread
end of thread, other threads:[~2015-01-06 21:43 UTC | newest]
Thread overview: 11+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2015-01-06 18:22 [gentoo-commits] proj/elfix:master commit in: misc/elf-abi/ Anthony G. Basile
-- strict thread matches above, loose matches on Subject: below --
2015-01-06 21:43 Anthony G. Basile
2015-01-06 21:34 Anthony G. Basile
2015-01-06 20:47 Anthony G. Basile
2015-01-06 17:26 Anthony G. Basile
2015-01-06 15:13 Anthony G. Basile
2015-01-05 16:26 Anthony G. Basile
2015-01-05 16:23 Anthony G. Basile
2015-01-03 23:53 Anthony G. Basile
2015-01-03 23:49 Anthony G. Basile
2015-01-03 23:19 Anthony G. Basile
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox