Go to file
David du Colombier 93999bc958 move from Travis CI to GitHub Actions 2022-04-04 22:03:56 +02:00
.github/workflows move from Travis CI to GitHub Actions 2022-04-04 22:03:56 +02:00
LICENSE initial commit 2016-11-21 22:11:53 +01:00
Makefile rename machines.c to str.c 2017-07-27 23:00:42 +02:00
README.md move from Travis CI to GitHub Actions 2022-04-04 22:03:56 +02:00
dat.h add osabi enum 2017-07-27 23:28:29 +02:00
elf.c handle ET_DYN and ET_CORE object file types 2018-04-02 11:42:47 +02:00
elf.h comment exported functions 2017-07-27 23:38:50 +02:00
fns.h initial commit 2016-11-21 22:11:53 +01:00
print.c add printelfhdr function 2017-07-27 23:38:26 +02:00
str.c add elfosabi function 2017-07-27 23:36:55 +02:00

README.md

Build Status Coverity Scan Build Status

libelf

Libelf is a simple library which provides functions to read ELF files.

Headers

#include <stdint.h>
#include <elf.h>

Structures

typedef struct Fhdr Fhdr;

/*
 * Portable ELF file header
 */
struct Fhdr {
	/* Private */
	...

	/* ELF Identification */
	uint8_t		class;		/* File class */
	uint8_t		data;		/* Data encoding */
	uint8_t		elfversion;	/* File version */
	uint8_t		osabi;		/* Operating system/ABI identification */
	uint8_t		abiversion;	/* ABI version */

	/* ELF Header */
	uint16_t	type;
	uint16_t	machine;
	uint32_t	version;
	uint64_t	entry;
	uint64_t	phoff;
	uint64_t	shoff;
	uint16_t	ehsize;		/* ELF Header size */
	uint16_t	phentsize;	/* Section Header size */
	uint16_t	phnum;
	uint16_t	shentsize;	/* Program Header size */
	uint16_t	shnum;
	uint16_t	shstrndx;

	/* Section Header */
	uint32_t	name;
	uint64_t	offset;
	uint64_t	size;

	/* String Table */
	uint32_t	strndxsize;	/* String Table Size */
	uint8_t		*strndx;	/* Copy of String Table */
};

Functions

/* Read */
int readelf(FILE *f, Fhdr *fp);
uint8_t* readelfsection(FILE *f, char *name, uint64_t *size, Fhdr *fp);
void freeelf(Fhdr *fp);

/* Print */
void printelfhdr(Fhdr *fp);

/* String */
char* elfclass(uint8_t class);
char* elfdata(uint8_t data);
char* elfosabi(uint8_t osabi);
char* elftype(uint16_t type);
char* elfmachine(uint16_t machine);
char* elfversion(uint8_t version);

Example

Fhdr fhdr;
FILE *f;
uint8_t *buf;
uint64_t len;

f = fopen("/bin/ls", "rb");
if (f == NULL)
	return -1;

buf = readelfsection(f, ".text", &len, &fhdr);
if (buf == NULL)
	return -1;

// ...

freeelf(&fhdr);