For a long time, adding an alias to a function required us to use the
"weak_alias" macro in the *same* source file as the original function.
This caused us to modify some Musl files we didn't want to modify.

In this patch I add a new mechanism for creating an alias for functions
without modifying their original file. The original symbol's address is
only known at link time, not compile time, so we do this symbol copying
via a linker script - we have a new file libc/aliases.ld with a simple
list of symbol assignments.

To demonstrate the easiness and useful of this feature, we drop one
file which we had to change from musl - res_init.c - just because
we wanted to add an alias to it. With the new aliases.ld - we no
longer need to modify the original file.

In followup patches we can move a lot of the aliases we added in other
ways (weak_alias / alias in modified files, wrappers in libc/math/aliases.cc)
to the new aliases.ld.

Signed-off-by: Nadav Har'El <[email protected]>
---
 Makefile                |  2 +-
 arch/aarch64/loader.ld  |  1 +
 arch/x64/loader.ld      |  1 +
 libc/aliases.ld         | 12 ++++++++++++
 libc/network/res_init.c |  7 -------
 5 files changed, 15 insertions(+), 8 deletions(-)
 create mode 100644 libc/aliases.ld
 delete mode 100644 libc/network/res_init.c

diff --git a/Makefile b/Makefile
index cd490a76..9bab08c0 100644
--- a/Makefile
+++ b/Makefile
@@ -1375,7 +1375,7 @@ musl += network/getservbyport.o
 libc += network/getifaddrs.o
 libc += network/if_nameindex.o
 musl += network/if_freenameindex.o
-libc += network/res_init.o
+musl += network/res_init.o
 
 musl += prng/rand.o
 musl += prng/rand_r.o
diff --git a/arch/aarch64/loader.ld b/arch/aarch64/loader.ld
index ad2135ee..a02e52b7 100644
--- a/arch/aarch64/loader.ld
+++ b/arch/aarch64/loader.ld
@@ -8,6 +8,7 @@
  */
 
 INCLUDE "loader_options.ld"
+INCLUDE "libc/aliases.ld"
 SECTIONS
 {
        /* Set the initial program counter to one page beyond the minimal
diff --git a/arch/x64/loader.ld b/arch/x64/loader.ld
index f981859d..dc963108 100644
--- a/arch/x64/loader.ld
+++ b/arch/x64/loader.ld
@@ -6,6 +6,7 @@
  */
 
 INCLUDE "loader_options.ld"
+INCLUDE "libc/aliases.ld"
 SECTIONS
 {
        /* Set the initial program counter to one page beyond the minimal
diff --git a/libc/aliases.ld b/libc/aliases.ld
new file mode 100644
index 00000000..89a87373
--- /dev/null
+++ b/libc/aliases.ld
@@ -0,0 +1,12 @@
+/* This file defines symbols as *aliases* to other symbols. The linker
+ * statically-linking the OSv kernel will set the alias's address to be
+ * the same one as the original symbol.
+ * 
+ * This technique is more powerful than the C compiler's "alias(...)"
+ * attribute - the compiler-only technique is only usable when the alias
+ * and original symbol are defined in the same translation unit, because
+ * it is the compiler - not the linker - who need to copy the symbol's
+ * address.
+ */
+
+__res_init = res_init;
diff --git a/libc/network/res_init.c b/libc/network/res_init.c
deleted file mode 100644
index 66f3f95a..00000000
--- a/libc/network/res_init.c
+++ /dev/null
@@ -1,7 +0,0 @@
-#include "libc.h"
-
-int res_init()
-{
-       return 0;
-}
-weak_alias(res_init, __res_init);
-- 
2.26.2

-- 
You received this message because you are subscribed to the Google Groups "OSv 
Development" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/osv-dev/20200803231809.1432323-1-nyh%40scylladb.com.

Reply via email to