From f8867ba93836f58034f6ecc8aa1409323df683c0 Mon Sep 17 00:00:00 2001 From: Izaak Schroeder Date: Sat, 6 Jul 2024 16:49:01 -0700 Subject: [PATCH 1/3] [libc] Add `link.h` and `elf.h` headers --- libc/config/linux/aarch64/headers.txt | 2 ++ libc/config/linux/x86_64/headers.txt | 2 ++ libc/include/CMakeLists.txt | 20 ++++++++++++++ libc/include/llvm-libc-macros/CMakeLists.txt | 6 +++++ libc/include/llvm-libc-macros/elf-macros.h | 18 +++++++++++++ libc/include/llvm-libc-macros/link-macros.h | 26 +++++++++++++++++-- libc/include/llvm-libc-types/CMakeLists.txt | 3 +++ libc/include/llvm-libc-types/Dl_info.h | 19 ++++++++++++++ .../__dl_iterate_phdr_callback_t.h | 17 ++++++++++++ .../llvm-libc-types/struct_dl_phdr_info.h | 26 +++++++++++++++++++ 10 files changed, 137 insertions(+), 2 deletions(-) create mode 100644 libc/include/llvm-libc-macros/elf-macros.h create mode 100644 libc/include/llvm-libc-types/Dl_info.h create mode 100644 libc/include/llvm-libc-types/__dl_iterate_phdr_callback_t.h create mode 100644 libc/include/llvm-libc-types/struct_dl_phdr_info.h diff --git a/libc/config/linux/aarch64/headers.txt b/libc/config/linux/aarch64/headers.txt index 8f898f0150905..ebe053af99d80 100644 --- a/libc/config/linux/aarch64/headers.txt +++ b/libc/config/linux/aarch64/headers.txt @@ -2,6 +2,7 @@ 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 @@ -9,6 +10,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.signal diff --git a/libc/config/linux/x86_64/headers.txt b/libc/config/linux/x86_64/headers.txt index df276894246c4..903771c5f96a6 100644 --- a/libc/config/linux/x86_64/headers.txt +++ b/libc/config/linux/x86_64/headers.txt @@ -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 @@ -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 diff --git a/libc/include/CMakeLists.txt b/libc/include/CMakeLists.txt index f8ef35078a8c4..a39c1c118165f 100644 --- a/libc/include/CMakeLists.txt +++ b/libc/include/CMakeLists.txt @@ -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 ) @@ -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. diff --git a/libc/include/llvm-libc-macros/CMakeLists.txt b/libc/include/llvm-libc-macros/CMakeLists.txt index 86d6271ff88ac..60c8f5a9cd3de 100644 --- a/libc/include/llvm-libc-macros/CMakeLists.txt +++ b/libc/include/llvm-libc-macros/CMakeLists.txt @@ -283,3 +283,9 @@ add_macro_header( HDR dlfcn-macros.h ) + +add_macro_header( + elf_macros + HDR + elf-macros.h +) diff --git a/libc/include/llvm-libc-macros/elf-macros.h b/libc/include/llvm-libc-macros/elf-macros.h new file mode 100644 index 0000000000000..fa4442abf0f5c --- /dev/null +++ b/libc/include/llvm-libc-macros/elf-macros.h @@ -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() +#include +#else +#error "cannot use without proper system headers." +#endif + +#endif // LLVM_LIBC_MACROS_ELF_MACROS_H diff --git a/libc/include/llvm-libc-macros/link-macros.h b/libc/include/llvm-libc-macros/link-macros.h index 5c8cadab8e71c..f7461d9527a47 100644 --- a/libc/include/llvm-libc-macros/link-macros.h +++ b/libc/include/llvm-libc-macros/link-macros.h @@ -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 diff --git a/libc/include/llvm-libc-types/CMakeLists.txt b/libc/include/llvm-libc-types/CMakeLists.txt index d8b975572e0dd..016ec14b077e8 100644 --- a/libc/include/llvm-libc-types/CMakeLists.txt +++ b/libc/include/llvm-libc-types/CMakeLists.txt @@ -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) diff --git a/libc/include/llvm-libc-types/Dl_info.h b/libc/include/llvm-libc-types/Dl_info.h new file mode 100644 index 0000000000000..613976a54bd61 --- /dev/null +++ b/libc/include/llvm-libc-types/Dl_info.h @@ -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 diff --git a/libc/include/llvm-libc-types/__dl_iterate_phdr_callback_t.h b/libc/include/llvm-libc-types/__dl_iterate_phdr_callback_t.h new file mode 100644 index 0000000000000..9d73e88076e00 --- /dev/null +++ b/libc/include/llvm-libc-types/__dl_iterate_phdr_callback_t.h @@ -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 diff --git a/libc/include/llvm-libc-types/struct_dl_phdr_info.h b/libc/include/llvm-libc-types/struct_dl_phdr_info.h new file mode 100644 index 0000000000000..66512b368e190 --- /dev/null +++ b/libc/include/llvm-libc-types/struct_dl_phdr_info.h @@ -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 From fa3703b610f65457ebde09739cb32590691860e5 Mon Sep 17 00:00:00 2001 From: Izaak Schroeder Date: Sat, 6 Jul 2024 17:22:01 -0700 Subject: [PATCH 2/3] fixup! Add header dependencies --- libc/include/llvm-libc-types/CMakeLists.txt | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/libc/include/llvm-libc-types/CMakeLists.txt b/libc/include/llvm-libc-types/CMakeLists.txt index 016ec14b077e8..9986329570c88 100644 --- a/libc/include/llvm-libc-types/CMakeLists.txt +++ b/libc/include/llvm-libc-types/CMakeLists.txt @@ -90,8 +90,21 @@ 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( + __dl_iterate_phdr_callback_t + HDR __dl_iterate_phdr_callback_t.h + DEPENDS + .size_t +) +add_header( + struct_dl_phdr_info + HDR struct_dl_phdr_info.h + DEPENDS + .__dl_iterate_phdr_callback_t + .size_t + libc.include.llvm-libc-macros.link-macros +) + 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) From 4dc7c880e3ac7c7f07b6350051552e8defe0ba0d Mon Sep 17 00:00:00 2001 From: Izaak Schroeder Date: Sat, 6 Jul 2024 17:37:40 -0700 Subject: [PATCH 3/3] fixup! `link_macros` is underscore --- libc/include/llvm-libc-types/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libc/include/llvm-libc-types/CMakeLists.txt b/libc/include/llvm-libc-types/CMakeLists.txt index 9986329570c88..87381136577ef 100644 --- a/libc/include/llvm-libc-types/CMakeLists.txt +++ b/libc/include/llvm-libc-types/CMakeLists.txt @@ -102,7 +102,7 @@ add_header( DEPENDS .__dl_iterate_phdr_callback_t .size_t - libc.include.llvm-libc-macros.link-macros + libc.include.llvm-libc-macros.link_macros ) add_header(speed_t HDR speed_t.h)