haiku/headers/private/runtime_loader/runtime_loader.h
Axel Dörfler 2716cfd3d7 * Threw away the broken stat() vs. _stat() mechanism to allow for more fields
in struct stat.
* Instead, I followed Marcus' great idea and added a compatibility check in
  the runtime loader: now, R5 binaries (also shared libraries) are detected,
  and they get special versions for stat(), fstat(), and lstat() that return
  the smaller stat struct.
* However, I've disabled (in src/system/libroot/posix/sys/stat.c) using the
  larger stat field for now, as this breaks some of our optional packages.
  So until we rebuild them all, this shouldn't be enabled.
* This should now also be used for BeOS compatibility in libnetwork.so.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@27961 a95241bf-73f2-0310-859d-f6bbb57e9c96
2008-10-10 22:13:05 +00:00

100 lines
2.4 KiB
C

/*
* Copyright 2003-2006, Axel Dörfler, axeld@pinc-software.de.
* Distributed under the terms of the MIT License.
*
* Copyright 2002, Manuel J. Petit. All rights reserved.
* Copyright 2001, Travis Geiselbrecht. All rights reserved.
* Distributed under the terms of the NewOS License.
*/
#ifndef _RUNTIME_LOADER_H
#define _RUNTIME_LOADER_H
#include <image.h>
#include <OS.h>
#include <elf32.h>
typedef struct elf_region_t {
area_id id;
addr_t start;
addr_t size;
addr_t vmstart;
addr_t vmsize;
addr_t fdstart;
addr_t fdsize;
long delta;
uint32 flags;
} elf_region_t;
typedef struct image_t {
// image identification
char path[B_PATH_NAME_LENGTH];
char name[B_OS_NAME_LENGTH];
image_id id;
image_type type;
struct image_t *next;
struct image_t *prev;
int32 ref_count;
uint32 flags;
struct {
int major;
int middle;
int minor;
bool haiku;
} gcc_version;
addr_t entry_point;
addr_t init_routine;
addr_t term_routine;
addr_t dynamic_ptr; // pointer to the dynamic section
// pointer to symbol participation data structures
uint32 *symhash;
struct Elf32_Sym *syms;
char *strtab;
struct Elf32_Rel *rel;
int rel_len;
struct Elf32_Rela *rela;
int rela_len;
struct Elf32_Rel *pltrel;
int pltrel_len;
uint32 num_needed;
struct image_t **needed;
// describes the text and data regions
uint32 num_regions;
elf_region_t regions[1];
} image_t;
typedef struct image_queue_t {
image_t *head;
image_t *tail;
} image_queue_t;
// image_t::flags
#define IMAGE_FLAG_RTLD_MASK 0x03
// RTLD_{LAZY,NOW} | RTLD_{LOCAL,GLOBAL}
#define IMAGE_FLAG_R5_SYMBOL_RESOLUTION 0x04
#define STRING(image, offset) ((char *)(&(image)->strtab[(offset)]))
#define SYMNAME(image, sym) STRING(image, (sym)->st_name)
#define SYMBOL(image, num) ((struct Elf32_Sym *)&(image)->syms[num])
#define HASHTABSIZE(image) ((image)->symhash[0])
#define HASHBUCKETS(image) ((unsigned int *)&(image)->symhash[2])
#define HASHCHAINS(image) ((unsigned int *)&(image)->symhash[2+HASHTABSIZE(image)])
// The name of the area the runtime loader creates for debugging purposes.
#define RUNTIME_LOADER_DEBUG_AREA_NAME "_rld_debug_"
// The contents of the runtime loader debug area.
typedef struct runtime_loader_debug_area {
image_queue_t *loaded_images;
} runtime_loader_debug_area;
#endif // _RUNTIME_LOADER_H