diff --git a/libc/config/linux/aarch64/entrypoints.txt b/libc/config/linux/aarch64/entrypoints.txt index 6c67e4bbadee7..7fa720fbf11a6 100644 --- a/libc/config/linux/aarch64/entrypoints.txt +++ b/libc/config/linux/aarch64/entrypoints.txt @@ -18,6 +18,7 @@ set(TARGET_LIBC_ENTRYPOINTS libc.src.ctype.toupper # dlfcn.h entrypoints + libc.src.dlfcn.dladdr libc.src.dlfcn.dlclose libc.src.dlfcn.dlerror libc.src.dlfcn.dlopen @@ -32,6 +33,9 @@ set(TARGET_LIBC_ENTRYPOINTS libc.src.fcntl.open libc.src.fcntl.openat + # link.h entrypoints + libc.src.link.dl_iterate_phdr + # sched.h entrypoints libc.src.sched.sched_get_priority_max libc.src.sched.sched_get_priority_min diff --git a/libc/config/linux/api.td b/libc/config/linux/api.td index eb0090c80b0da..3ff99f263f811 100644 --- a/libc/config/linux/api.td +++ b/libc/config/linux/api.td @@ -308,3 +308,16 @@ def SearchAPI : PublicAPI<"search.h"> { def SysStatvfsAPI : PublicAPI<"sys/statvfs.h"> { let Types = ["fsblkcnt_t", "fsfilcnt_t", "struct statvfs"]; } + +def LinkAPI : PublicAPI<"link.h"> { + let Types = [ + "struct dl_phdr_info", + "__dl_iterate_phdr_callback_t" + ]; +} + +def DlfcnAPI : PublicAPI<"dlfcn.h"> { + let Types = [ + "Dl_info" + ]; +} diff --git a/libc/config/linux/x86_64/entrypoints.txt b/libc/config/linux/x86_64/entrypoints.txt index 2ca8f00d2de50..78947e8272126 100644 --- a/libc/config/linux/x86_64/entrypoints.txt +++ b/libc/config/linux/x86_64/entrypoints.txt @@ -18,6 +18,7 @@ set(TARGET_LIBC_ENTRYPOINTS libc.src.ctype.toupper # dlfcn.h entrypoints + libc.src.dlfcn.dladdr libc.src.dlfcn.dlclose libc.src.dlfcn.dlerror libc.src.dlfcn.dlopen @@ -32,6 +33,9 @@ set(TARGET_LIBC_ENTRYPOINTS libc.src.fcntl.open libc.src.fcntl.openat + # link.h entrypoints + libc.src.link.dl_iterate_phdr + # sched.h entrypoints libc.src.sched.sched_get_priority_max libc.src.sched.sched_get_priority_min diff --git a/libc/include/elf.h.def b/libc/include/elf.h.def new file mode 100644 index 0000000000000..1c9d11929029f --- /dev/null +++ b/libc/include/elf.h.def @@ -0,0 +1,14 @@ +//===-- C standard library header 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_ELF_H +#define LLVM_LIBC_ELF_H + +#include "llvm-libc-macros/elf-macros.h" + +#endif // LLVM_LIBC_ELF_H diff --git a/libc/include/link.h.def b/libc/include/link.h.def new file mode 100644 index 0000000000000..353398e4f3c88 --- /dev/null +++ b/libc/include/link.h.def @@ -0,0 +1,16 @@ +//===-- C standard library header link.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_LINK_H +#define LLVM_LIBC_LINK_H + +#include "llvm-libc-macros/link-macros.h" + +%%public_api() + +#endif // LLVM_LIBC_LINK_H diff --git a/libc/spec/linux.td b/libc/spec/linux.td index 82630ff413c73..bd13dd17a85cd 100644 --- a/libc/spec/linux.td +++ b/libc/spec/linux.td @@ -3,6 +3,9 @@ def StructEpollEventPtr : PtrType; def StructEpollData : NamedType<"struct epoll_data">; +def StructDlPhdrInfo : NamedType<"struct dl_phdr_info">; +def DlIteratePhdrCallback : NamedType<"__dl_iterate_phdr_callback_t">; + def Linux : StandardSpec<"Linux"> { HeaderSpec Errno = HeaderSpec< "errno.h", @@ -264,8 +267,35 @@ def Linux : StandardSpec<"Linux"> { ] >; + HeaderSpec Link = HeaderSpec< + "link.h", + [], // Macros + [StructDlPhdrInfo, DlIteratePhdrCallback], // Types + [], // Enumerations + [ + FunctionSpec< + "dl_iterate_phdr", + RetValSpec, + [ + ArgSpec, + ArgSpec + ] + >, + ] // Functions + >; + + HeaderSpec Elf = HeaderSpec< + "elf.h", + [], // Macros + [], // Types + [], // Enumerations + [] // Functions + >; + let Headers = [ + Elf, Errno, + Link, SysEpoll, SysMMan, SysPrctl, diff --git a/libc/spec/posix.td b/libc/spec/posix.td index 1878b1ee2ae41..1a829704c0667 100644 --- a/libc/spec/posix.td +++ b/libc/spec/posix.td @@ -21,6 +21,9 @@ def PThreadOnceT : NamedType<"pthread_once_t">; def PThreadOnceTPtr : PtrType; def PThreadOnceCallback : NamedType<"__pthread_once_func_t">; +def DlInfo : NamedType<"Dl_info">; +def DlInfoPtr : PtrType; + def InoT : NamedType<"ino_t">; def UidT : NamedType<"uid_t">; def GidT : NamedType<"gid_t">; @@ -230,9 +233,14 @@ def POSIX : StandardSpec<"POSIX"> { Macro<"RTLD_GLOBAL">, Macro<"RTLD_LOCAL">, ], - [], // Types + [DlInfo], // Types [], // Enumerations [ + FunctionSpec< + "dladdr", + RetValSpec, + [ArgSpec, ArgSpec] + >, FunctionSpec< "dlclose", RetValSpec, diff --git a/libc/src/CMakeLists.txt b/libc/src/CMakeLists.txt index 9597e2380172b..204f65ba32597 100644 --- a/libc/src/CMakeLists.txt +++ b/libc/src/CMakeLists.txt @@ -5,6 +5,7 @@ add_subdirectory(dlfcn) add_subdirectory(errno) add_subdirectory(fenv) add_subdirectory(inttypes) +add_subdirectory(link) add_subdirectory(math) add_subdirectory(stdbit) add_subdirectory(stdfix) diff --git a/libc/src/dlfcn/CMakeLists.txt b/libc/src/dlfcn/CMakeLists.txt index e3a51ba65764d..ff79c53237d60 100644 --- a/libc/src/dlfcn/CMakeLists.txt +++ b/libc/src/dlfcn/CMakeLists.txt @@ -1,3 +1,14 @@ +add_entrypoint_object( + dladdr + SRCS + dladdr.cpp + HDRS + dladdr.h + DEPENDS + libc.include.dlfcn + libc.src.errno.errno +) + add_entrypoint_object( dlclose SRCS diff --git a/libc/src/dlfcn/dladdr.cpp b/libc/src/dlfcn/dladdr.cpp new file mode 100644 index 0000000000000..68ee95c26ebb2 --- /dev/null +++ b/libc/src/dlfcn/dladdr.cpp @@ -0,0 +1,18 @@ +//===-- Implementation of dladdr -----------------------------------------===// +// +// 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 +// +//===----------------------------------------------------------------------===// + +#include "dladdr.h" + +#include "src/__support/common.h" + +namespace LIBC_NAMESPACE { + +// TODO(@izaakschroeder): https://github.com/llvm/llvm-project/issues/97929 +LLVM_LIBC_FUNCTION(int, dladdr, (const void *, Dl_info *)) { return 0; } + +} // namespace LIBC_NAMESPACE diff --git a/libc/src/dlfcn/dladdr.h b/libc/src/dlfcn/dladdr.h new file mode 100644 index 0000000000000..b86f3fdea0dde --- /dev/null +++ b/libc/src/dlfcn/dladdr.h @@ -0,0 +1,20 @@ +//===-- Implementation header of dladdr ------------------------*- C++ -*-===// +// +// 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_SRC_DLFCN_DLADDR_H +#define LLVM_LIBC_SRC_DLFCN_DLADDR_H + +namespace LIBC_NAMESPACE { + +#include "include/llvm-libc-types/Dl_info.h" + +int dladdr(const void *, Dl_info *); + +} // namespace LIBC_NAMESPACE + +#endif // LLVM_LIBC_SRC_DLFCN_DLADDR_H diff --git a/libc/src/link/CMakeLists.txt b/libc/src/link/CMakeLists.txt new file mode 100644 index 0000000000000..06f5e05e624fd --- /dev/null +++ b/libc/src/link/CMakeLists.txt @@ -0,0 +1,9 @@ +add_entrypoint_object( + dl_iterate_phdr + SRCS + dl_iterate_phdr.cpp + HDRS + dl_iterate_phdr.h + DEPENDS + libc.src.__support.common +) diff --git a/libc/src/link/dl_iterate_phdr.cpp b/libc/src/link/dl_iterate_phdr.cpp new file mode 100644 index 0000000000000..8c4b4f09da24f --- /dev/null +++ b/libc/src/link/dl_iterate_phdr.cpp @@ -0,0 +1,20 @@ +//===-- Implementation of dl_iterate_phdr ---------------------------------===// +// +// 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 +// +//===----------------------------------------------------------------------===// + +#include "dl_iterate_phdr.h" +#include "src/__support/common.h" + +namespace LIBC_NAMESPACE { + +// TODO(@izaakschroeder): https://github.com/llvm/llvm-project/issues/97928 +LLVM_LIBC_FUNCTION(int, dl_iterate_phdr, + (__dl_iterate_phdr_callback_t, void *)) { + return -1; +} + +} // namespace LIBC_NAMESPACE diff --git a/libc/src/link/dl_iterate_phdr.h b/libc/src/link/dl_iterate_phdr.h new file mode 100644 index 0000000000000..b7f7951e883a8 --- /dev/null +++ b/libc/src/link/dl_iterate_phdr.h @@ -0,0 +1,20 @@ +//===-- Implementation header for dl_iterate_phdr ---------------*- C++ -*-===// +// +// 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_SRC_LINK_DL_ITERATE_PHDR_H +#define LLVM_LIBC_SRC_LINK_DL_ITERATE_PHDR_H + +namespace LIBC_NAMESPACE { + +#include "include/llvm-libc-types/__dl_iterate_phdr_callback_t.h" + +int dl_iterate_phdr(__dl_iterate_phdr_callback_t, void *); + +} // namespace LIBC_NAMESPACE + +#endif // LLVM_LIBC_SRC_LINK_DL_ITERATE_PHDR_H