Skip to content

Commit

Permalink
[libc] Add link.h and elf.h headers
Browse files Browse the repository at this point in the history
  • Loading branch information
izaakschroeder committed Jul 6, 2024
1 parent 75bc20f commit f8867ba
Show file tree
Hide file tree
Showing 10 changed files with 137 additions and 2 deletions.
2 changes: 2 additions & 0 deletions libc/config/linux/aarch64/headers.txt
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,15 @@ set(TARGET_PUBLIC_HEADERS
libc.include.assert
libc.include.ctype
libc.include.dlfcn
libc.include.elf
libc.include.errno
libc.include.features
libc.include.fenv
libc.include.float
libc.include.stdint
libc.include.inttypes
libc.include.limits
libc.include.link
libc.include.math
libc.include.pthread
libc.include.signal
Expand Down
2 changes: 2 additions & 0 deletions libc/config/linux/x86_64/headers.txt
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ set(TARGET_PUBLIC_HEADERS
libc.include.ctype
libc.include.dirent
libc.include.dlfcn
libc.include.elf
libc.include.errno
libc.include.fcntl
libc.include.features
Expand All @@ -11,6 +12,7 @@ set(TARGET_PUBLIC_HEADERS
libc.include.stdint
libc.include.inttypes
libc.include.limits
libc.include.link
libc.include.math
libc.include.pthread
libc.include.sched
Expand Down
20 changes: 20 additions & 0 deletions libc/include/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,7 @@ add_gen_header(
DEF_FILE dlfcn.h.def
GEN_HDR dlfcn.h
DEPENDS
.llvm-libc-types.Dl_info
.llvm-libc-macros.dlfcn_macros
.llvm_libc_common_h
)
Expand Down Expand Up @@ -367,6 +368,25 @@ add_gen_header(
.llvm-libc-types.posix_spawn_file_actions_t
)

add_gen_header(
link
DEF_FILE link.h.def
GEN_HDR link.h
DEPENDS
.llvm_libc_common_h
.llvm-libc-types.struct_dl_phdr_info
.llvm-libc-types.__dl_iterate_phdr_callback_t
.llvm-libc-macros.link_macros
)

add_gen_header(
elf
DEF_FILE elf.h.def
GEN_HDR elf.h
DEPENDS
.llvm-libc-macros.elf_macros
)

# TODO: Not all platforms will have a include/sys directory. Add the sys
# directory and the targets for sys/*.h files conditional to the OS requiring
# them.
Expand Down
6 changes: 6 additions & 0 deletions libc/include/llvm-libc-macros/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -283,3 +283,9 @@ add_macro_header(
HDR
dlfcn-macros.h
)

add_macro_header(
elf_macros
HDR
elf-macros.h
)
18 changes: 18 additions & 0 deletions libc/include/llvm-libc-macros/elf-macros.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
//===-- Definition of macros from elf.h -----------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//

#ifndef LLVM_LIBC_MACROS_ELF_MACROS_H
#define LLVM_LIBC_MACROS_ELF_MACROS_H

#if __has_include(<linux/elf.h>)
#include <linux/elf.h>
#else
#error "cannot use <sys/elf.h> without proper system headers."
#endif

#endif // LLVM_LIBC_MACROS_ELF_MACROS_H
26 changes: 24 additions & 2 deletions libc/include/llvm-libc-macros/link-macros.h
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,30 @@
//
//===----------------------------------------------------------------------===//

#ifndef LLVM_LIBC_MACROS_LINK_MACROS_H
#define LLVM_LIBC_MACROS_LINK_MACROS_H

#include "elf-macros.h"

#ifdef __LP64__
#define ElfW(type) Elf64_ ## type
#define ElfW(type) Elf64_##type
#else
#define ElfW(type) Elf32_ ## type
#define ElfW(type) Elf32_##type
#endif

struct link_map {
ElfW(Addr) l_addr;
char *l_name;
ElfW(Dyn) * l_ld;
struct link_map *l_next, *l_prev;
};

struct r_debug {
int r_version;
struct link_map *r_map;
ElfW(Addr) r_brk;
enum { RT_CONSISTENT, RT_ADD, RT_DELETE } r_state;
ElfW(Addr) r_ldbase;
};

#endif
3 changes: 3 additions & 0 deletions libc/include/llvm-libc-types/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,9 @@ add_header(thrd_t HDR thrd_t.h DEPENDS .__thread_type)
add_header(tss_t HDR tss_t.h)
add_header(tss_dtor_t HDR tss_dtor_t.h)
add_header(__atexithandler_t HDR __atexithandler_t.h)
add_header(Dl_info HDR Dl_info.h)
add_header(struct_dl_phdr_info HDR struct_dl_phdr_info.h)
add_header(__dl_iterate_phdr_callback_t HDR __dl_iterate_phdr_callback_t.h)
add_header(speed_t HDR speed_t.h)
add_header(tcflag_t HDR tcflag_t.h)
add_header(struct_termios HDR struct_termios.h DEPENDS .cc_t .speed_t .tcflag_t)
Expand Down
19 changes: 19 additions & 0 deletions libc/include/llvm-libc-types/Dl_info.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
//===-- Definition of type Dl_info ----------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//

#ifndef LLVM_LIBC_TYPES_DL_INFO_H
#define LLVM_LIBC_TYPES_DL_INFO_H

typedef struct {
const char *dli_fname;
void *dli_fbase;
const char *dli_sname;
void *dli_saddr;
} Dl_info;

#endif // LLVM_LIBC_TYPES_DL_INFO_H
17 changes: 17 additions & 0 deletions libc/include/llvm-libc-types/__dl_iterate_phdr_callback_t.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
//===-- Definition of __dl_iterate_phdr_callback_t type -------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//

#ifndef LLVM_LIBC_TYPES___DL_ITERATE_PHDR_CALLBACK_T_H
#define LLVM_LIBC_TYPES___DL_ITERATE_PHDR_CALLBACK_T_H

#include "llvm-libc-types/size_t.h"

typedef int (*__dl_iterate_phdr_callback_t)(struct dl_phdr_info *info,
size_t size, void *data);

#endif // LLVM_LIBC_TYPES___DL_ITERATE_PHDR_CALLBACK_T_H
26 changes: 26 additions & 0 deletions libc/include/llvm-libc-types/struct_dl_phdr_info.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
//===-- Definition of type struct dl_phdr_info ----------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//

#ifndef LLVM_LIBC_TYPES_STRUCT_DL_PHDR_INFO_H
#define LLVM_LIBC_TYPES_STRUCT_DL_PHDR_INFO_H

#include "llvm-libc-macros/link-macros.h"
#include "llvm-libc-types/size_t.h"

struct dl_phdr_info {
ElfW(Addr) dlpi_addr;
const char *dlpi_name;
const ElfW(Phdr) * dlpi_phdr;
ElfW(Half) dlpi_phnum;
unsigned long long int dlpi_adds;
unsigned long long int dlpi_subs;
size_t dlpi_tls_modid;
void *dlpi_tls_data;
};

#endif // LLVM_LIBC_TYPES_STRUCT_DL_PHDR_INFO_H

0 comments on commit f8867ba

Please sign in to comment.