Linux Audio

Check our new training course

Loading...
Note: File does not exist in v3.1.
  1// SPDX-License-Identifier: GPL-2.0
  2#include <byteswap.h>
  3#include <elf.h>
  4#include <endian.h>
  5#include <inttypes.h>
  6#include <stdint.h>
  7#include <stdio.h>
  8#include <stdlib.h>
  9#include <string.h>
 10
 11#ifdef be32toh
 12/* If libc provides [bl]e{32,64}toh() then we'll use them */
 13#elif BYTE_ORDER == LITTLE_ENDIAN
 14# define be32toh(x)	bswap_32(x)
 15# define le32toh(x)	(x)
 16# define be64toh(x)	bswap_64(x)
 17# define le64toh(x)	(x)
 18#elif BYTE_ORDER == BIG_ENDIAN
 19# define be32toh(x)	(x)
 20# define le32toh(x)	bswap_32(x)
 21# define be64toh(x)	(x)
 22# define le64toh(x)	bswap_64(x)
 23#endif
 24
 25__attribute__((noreturn))
 26static void die(const char *msg)
 27{
 28	fputs(msg, stderr);
 29	exit(EXIT_FAILURE);
 30}
 31
 32int main(int argc, const char *argv[])
 33{
 34	uint64_t entry;
 35	size_t nread;
 36	FILE *file;
 37	union {
 38		Elf32_Ehdr ehdr32;
 39		Elf64_Ehdr ehdr64;
 40	} hdr;
 41
 42	if (argc != 2)
 43		die("Usage: elf-entry <elf-file>\n");
 44
 45	file = fopen(argv[1], "r");
 46	if (!file) {
 47		perror("Unable to open input file");
 48		return EXIT_FAILURE;
 49	}
 50
 51	nread = fread(&hdr, 1, sizeof(hdr), file);
 52	if (nread != sizeof(hdr)) {
 53		perror("Unable to read input file");
 54		fclose(file);
 55		return EXIT_FAILURE;
 56	}
 57
 58	if (memcmp(hdr.ehdr32.e_ident, ELFMAG, SELFMAG)) {
 59		fclose(file);
 60		die("Input is not an ELF\n");
 61	}
 62
 63	switch (hdr.ehdr32.e_ident[EI_CLASS]) {
 64	case ELFCLASS32:
 65		switch (hdr.ehdr32.e_ident[EI_DATA]) {
 66		case ELFDATA2LSB:
 67			entry = le32toh(hdr.ehdr32.e_entry);
 68			break;
 69		case ELFDATA2MSB:
 70			entry = be32toh(hdr.ehdr32.e_entry);
 71			break;
 72		default:
 73			fclose(file);
 74			die("Invalid ELF encoding\n");
 75		}
 76
 77		/* Sign extend to form a canonical address */
 78		entry = (int64_t)(int32_t)entry;
 79		break;
 80
 81	case ELFCLASS64:
 82		switch (hdr.ehdr32.e_ident[EI_DATA]) {
 83		case ELFDATA2LSB:
 84			entry = le64toh(hdr.ehdr64.e_entry);
 85			break;
 86		case ELFDATA2MSB:
 87			entry = be64toh(hdr.ehdr64.e_entry);
 88			break;
 89		default:
 90			fclose(file);
 91			die("Invalid ELF encoding\n");
 92		}
 93		break;
 94
 95	default:
 96		fclose(file);
 97		die("Invalid ELF class\n");
 98	}
 99
100	printf("0x%016" PRIx64 "\n", entry);
101	fclose(file);
102	return EXIT_SUCCESS;
103}