summaryrefslogtreecommitdiffstats
path: root/sys/kern/link_elf.c
diff options
context:
space:
mode:
authormarcel <marcel@FreeBSD.org>2002-04-21 21:08:30 +0000
committermarcel <marcel@FreeBSD.org>2002-04-21 21:08:30 +0000
commit84ecc1bfc1e9c35c1e8d63c892ea7f4fbd01f396 (patch)
tree745d9e23292cef4ba528d7c410f78377f0a1dde6 /sys/kern/link_elf.c
parentdc941e21d52b31176fe0eccccebef9f4dec29970 (diff)
downloadFreeBSD-src-84ecc1bfc1e9c35c1e8d63c892ea7f4fbd01f396.zip
FreeBSD-src-84ecc1bfc1e9c35c1e8d63c892ea7f4fbd01f396.tar.gz
Add function link_elf_get_gp(), specific to ia64 for now, to get
the DT_PLTGOT value. On ia64 this is the value of GP. We need this to construct function descriptors, but the elf file structure is not exported to MD code. Note that the name of the function is based on the meaning that DT_PLTGOT has on ia64. This may differ on other architectures. As such, link_elf_get_gp() has a high level of MD to it. Renaming the function to describe what DT_* value is returned makes it generic, but also makes the MD code less clear and if we only need this on ia64, then a general name for a specific function doesn't help. In short: I don't know what is "right" at this time, so I'll go with what I have.
Diffstat (limited to 'sys/kern/link_elf.c')
-rw-r--r--sys/kern/link_elf.c19
1 files changed, 19 insertions, 0 deletions
diff --git a/sys/kern/link_elf.c b/sys/kern/link_elf.c
index fe4aba3..8eb7681 100644
--- a/sys/kern/link_elf.c
+++ b/sys/kern/link_elf.c
@@ -165,6 +165,10 @@ r_debug_state(struct r_debug *dummy_one __unused,
#endif
+#ifdef __ia64__
+Elf_Addr link_elf_get_gp(linker_file_t);
+#endif
+
/*
* The kernel symbol table starts here.
*/
@@ -1171,3 +1175,18 @@ link_elf_each_function_name(linker_file_t file,
}
return (0);
}
+
+#ifdef __ia64__
+/*
+ * Each KLD has its own GP. The GP value for each load module is given by
+ * DT_PLTGOT on ia64. We need GP to construct function descriptors, but
+ * don't have direct access to the ELF file structure. The link_elf_get_gp()
+ * function returns the GP given a pointer to a generic linker file struct.
+ */
+Elf_Addr
+link_elf_get_gp(linker_file_t lf)
+{
+ elf_file_t ef = (elf_file_t)lf;
+ return (Elf_Addr)ef->got;
+}
+#endif
OpenPOWER on IntegriCloud