hrev56227 adds 2 changesets to branch 'master'
old head: c5702ad4e84cf89a2a1066bc8a0054c3ef12d838
new head: 908107a15f63582157c7094be7273dbfffa1003c
overview:
https://git.haiku-os.org/haiku/log/?qt=range&q=908107a15f63+%5Ec5702ad4e84c
----------------------------------------------------------------------------
045f7a5f3aad: headers/bsd: Rewrite link_elf.h.
Include only the APIs we are (shortly) going to actually support.
The other structures and functions declared in this file were
never supported nor used anywhere in Haiku's tree.
[ Augustin Cavalier <waddlesplash@xxxxxxxxx> ]
908107a15f63: libs/bsd: implemented dl_iterate_phdr
dl_iterate_phdr now fills the first four fields of
struct dl_phdr_info. The last four fields remain
unimplemented, as it requires help from the
runtime_loader.
Change-Id: Id96a7c7ac05633a71b9fb62c98b3a40f7d4f255b
Signed-off-by: Augustin Cavalier <waddlesplash@xxxxxxxxx>
[ Trung Nguyen <trungnt282910@xxxxxxxxx> ]
----------------------------------------------------------------------------
3 files changed, 79 insertions(+), 93 deletions(-)
headers/compatibility/bsd/sys/link_elf.h | 110 +++++----------------------
src/libs/bsd/Jamfile | 1 +
src/libs/bsd/dl_iterate_phdr.c | 61 +++++++++++++++
############################################################################
Commit: 045f7a5f3aaddd0db49e2fdca4524a677c5cf76a
URL: https://git.haiku-os.org/haiku/commit/?id=045f7a5f3aad
Author: Augustin Cavalier <waddlesplash@xxxxxxxxx>
Date: Tue Jun 28 17:04:52 2022 UTC
headers/bsd: Rewrite link_elf.h.
Include only the APIs we are (shortly) going to actually support.
The other structures and functions declared in this file were
never supported nor used anywhere in Haiku's tree.
----------------------------------------------------------------------------
diff --git a/headers/compatibility/bsd/sys/link_elf.h
b/headers/compatibility/bsd/sys/link_elf.h
index 916caefd16..7d01d03cf4 100644
--- a/headers/compatibility/bsd/sys/link_elf.h
+++ b/headers/compatibility/bsd/sys/link_elf.h
@@ -1,47 +1,12 @@
-/*-
- * SPDX-License-Identifier: BSD-4-Clause
- *
- * Copyright (c) 1993 Paul Kranenburg
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by Paul Kranenburg.
- * 4. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * $FreeBSD$
- */
-
/*
- * RRS section definitions.
- *
- * The layout of some data structures defined in this header file is
- * such that we can provide compatibility with the SunOS 4.x shared
- * library scheme.
+ * Copyright 2022, Haiku, Inc. All rights reserved.
+ * Distributed under the terms of the MIT License.
*/
+#ifndef _BSD_SYS_LINK_ELF_H_
+#define _BSD_SYS_LINK_ELF_H_
+
-#ifndef _SYS_LINK_ELF_H_
-#define _SYS_LINK_ELF_H_
+#include <features.h>
#ifdef _DEFAULT_SOURCE
@@ -49,69 +14,28 @@
#include <os/kernel/elf.h>
-/*
- * Flags that describe the origin of the entries in Dl_serinfo.
- * SunOS has these in <sys/link.h>, we follow the suit.
- */
-#define LA_SER_ORIG 0x01 /* original (needed) name */
-#define LA_SER_LIBPATH 0x02 /* LD_LIBRARY_PATH entry prepended */
-#define LA_SER_RUNPATH 0x04 /* runpath entry prepended */
-#define LA_SER_CONFIG 0x08 /* configuration entry prepended */
-#define LA_SER_DEFAULT 0x40 /* default path prepended */
-#define LA_SER_SECURE 0x80 /* default (secure) path prepended */
-
-typedef struct link_map {
- caddr_t l_addr; /* Base Address of library */
-#ifdef __mips__
- caddr_t l_offs; /* Load Offset of library */
-#endif
- const char *l_name; /* Absolute Path to Library */
- const void *l_ld; /* Pointer to .dynamic in
memory */
- struct link_map *l_next, *l_prev; /* linked list of of mapped
libs */
-} Link_map;
-
-struct r_debug {
- int r_version; /* not used */
- struct link_map *r_map; /* list of loaded images */
- void (*r_brk)(struct r_debug *, struct link_map *);
- /* pointer to break point */
- enum {
- RT_CONSISTENT, /* things are stable */
- RT_ADD, /* adding a shared library */
- RT_DELETE /* removing a shared library */
- } r_state;
-};
-struct dl_phdr_info
-{
- Elf_Addr dlpi_addr; /* module relocation base */
- const char *dlpi_name; /* module name */
- const Elf_Phdr *dlpi_phdr; /* pointer to module's phdr */
- Elf_Half dlpi_phnum; /* number of entries in phdr */
- unsigned long long int dlpi_adds; /* total # of loads */
- unsigned long long int dlpi_subs; /* total # of unloads */
- size_t dlpi_tls_modid;
- void *dlpi_tls_data;
+struct dl_phdr_info {
+ Elf_Addr dlpi_addr;
+ const char *dlpi_name;
+ const Elf_Phdr *dlpi_phdr;
+ Elf_Half dlpi_phnum;
};
-#include <sys/cdefs.h>
-__BEGIN_DECLS
+#ifdef __cplusplus
+extern "C" {
+#endif
typedef int (*__dl_iterate_hdr_callback)(struct dl_phdr_info *, size_t, void
*);
extern int dl_iterate_phdr(__dl_iterate_hdr_callback, void *);
-int _rtld_addr_phdr(const void *, struct dl_phdr_info *);
-int _rtld_get_stack_prot(void);
-int _rtld_is_dlopened(void *);
-#ifdef __ARM_EABI__
-void * dl_unwind_find_exidx(const void *, int *);
+#ifdef __cplusplus
+}
#endif
-__END_DECLS
-
#endif
-#endif /* _SYS_LINK_ELF_H_ */
+#endif /* _BSD_SYS_LINK_ELF_H_ */
############################################################################
Revision: hrev56227
Commit: 908107a15f63582157c7094be7273dbfffa1003c
URL: https://git.haiku-os.org/haiku/commit/?id=908107a15f63
Author: Trung Nguyen <trungnt282910@xxxxxxxxx>
Date: Thu May 26 13:48:56 2022 UTC
Committer: Augustin Cavalier <waddlesplash@xxxxxxxxx>
Commit-Date: Tue Jun 28 17:07:54 2022 UTC
libs/bsd: implemented dl_iterate_phdr
dl_iterate_phdr now fills the first four fields of
struct dl_phdr_info. The last four fields remain
unimplemented, as it requires help from the
runtime_loader.
Change-Id: Id96a7c7ac05633a71b9fb62c98b3a40f7d4f255b
Signed-off-by: Augustin Cavalier <waddlesplash@xxxxxxxxx>
----------------------------------------------------------------------------
diff --git a/src/libs/bsd/Jamfile b/src/libs/bsd/Jamfile
index 3f22999240..1d3c7d836e 100644
--- a/src/libs/bsd/Jamfile
+++ b/src/libs/bsd/Jamfile
@@ -10,6 +10,7 @@ for architectureObject in [ MultiArchSubDirSetup ] {
SharedLibrary [ MultiArchDefaultGristFiles libbsd.so ] :
daemon.c
+ dl_iterate_phdr.c
err.c
explicit_bzero.c
fgetln.c
diff --git a/src/libs/bsd/dl_iterate_phdr.c b/src/libs/bsd/dl_iterate_phdr.c
new file mode 100644
index 0000000000..540c7c3152
--- /dev/null
+++ b/src/libs/bsd/dl_iterate_phdr.c
@@ -0,0 +1,61 @@
+/*
+ * Copyright 2022, Haiku, Inc. All rights reserved.
+ * Distributed under the terms of the MIT License.
+ *
+ * Authors:
+ * Trung Nguyen, trungnt282910@xxxxxxxxx
+ */
+
+
+#include <kernel/image.h>
+#include <link.h>
+#include <stddef.h>
+
+
+#if B_HAIKU_32_BIT
+ typedef Elf32_Ehdr Elf_Ehdr;
+#elif B_HAIKU_64_BIT
+ typedef Elf64_Ehdr Elf_Ehdr;
+#endif
+
+
+// While get_next_image_info does not return the address of
+// the ELF header, it does return the first page of the image's
+// text segment (defined by runtime_loader as the first loaded page
+// with read-only protection). For most images produced by
+// normal compilers, including Haiku ELF files, the file header
+// is always loaded at the beginning of the text segment.
+//
+// We can therefore take advantage of this fact and populate
+// struct dl_phdr_info.
+int
+dl_iterate_phdr(int (*callback)(struct dl_phdr_info* info, size_t size, void*
data), void* data)
+{
+ image_info info;
+ int32 cookie = 0;
+ int status;
+
+ struct dl_phdr_info phdr_info;
+
+ while (get_next_image_info(0, &cookie, &info) == B_OK) {
+ const Elf_Ehdr* header = (const Elf_Ehdr*)info.text;
+
+ // Check for the special commpage info (which is not an ELF
image),
+ // and also guard against any maliciously crafted file which
+ // does not load its header in memory.
+ if (!IS_ELF(*header))
+ continue;
+
+ phdr_info.dlpi_addr = (Elf_Addr)info.text;
+ phdr_info.dlpi_name = info.name;
+ phdr_info.dlpi_phnum = header->e_phnum;
+ phdr_info.dlpi_phdr = (const Elf_Phdr*)((const char*)info.text
+ header->e_phoff);
+
+ status = callback(&phdr_info, sizeof(phdr_info), data);
+
+ if (status != 0)
+ return status;
+ }
+
+ return 0;
+}