summaryrefslogtreecommitdiff
path: root/libc/sysdeps/linux
diff options
context:
space:
mode:
authorEric Andersen <andersen@codepoet.org>2002-04-14 03:32:14 +0000
committerEric Andersen <andersen@codepoet.org>2002-04-14 03:32:14 +0000
commit5ce9147ea3796f0dca7f8fffce8b4c398eb08915 (patch)
tree2be24c643076c82822ab78c0bd07ab74a48ec9f0 /libc/sysdeps/linux
parented44f35a1aa84c6e42dac46aab75e9f8fcc6d7b7 (diff)
Manuel and I were looking into a problem with applications failing to link
(undefined reference to `main') when the .o file containing main was contained in an static library(a '.a' ar archive). It turns out that due to its single pass nature, GNU ld was failing to pull it into the build. This sticks a dummy reference to main() into crt0.o, so that when an application is linked with the main() function in a static library, we can be sure that main() actually gets linked in. -Erik
Diffstat (limited to 'libc/sysdeps/linux')
-rw-r--r--libc/sysdeps/linux/arm/crt0.S6
-rw-r--r--libc/sysdeps/linux/h8300/crt0.S8
-rw-r--r--libc/sysdeps/linux/i386/crt0.S6
-rw-r--r--libc/sysdeps/linux/i386/crt0.c1
-rw-r--r--libc/sysdeps/linux/m68k/crt0.S7
-rw-r--r--libc/sysdeps/linux/m68k/crt0.c1
-rw-r--r--libc/sysdeps/linux/mips/crt0.S6
-rw-r--r--libc/sysdeps/linux/powerpc/crt0.S8
-rw-r--r--libc/sysdeps/linux/powerpc/crt0.c4
-rw-r--r--libc/sysdeps/linux/sh/crt0.S7
-rw-r--r--libc/sysdeps/linux/sparc/crt0.c5
-rw-r--r--libc/sysdeps/linux/v850/crt0.S7
12 files changed, 65 insertions, 1 deletions
diff --git a/libc/sysdeps/linux/arm/crt0.S b/libc/sysdeps/linux/arm/crt0.S
index 0d4031eaf..442c9e84b 100644
--- a/libc/sysdeps/linux/arm/crt0.S
+++ b/libc/sysdeps/linux/arm/crt0.S
@@ -92,3 +92,9 @@ _start:
/* Ok, now run uClibc's main() -- shouldn't return */
bl __uClibc_main
+/* Stick in a dummy reference to main(), so that if an application
+ * is linking when the main() function is in a static library (.a)
+ * we can be sure that main() actually gets linked in */
+L_dummy_main_reference:
+ .long main
+
diff --git a/libc/sysdeps/linux/h8300/crt0.S b/libc/sysdeps/linux/h8300/crt0.S
index f51614571..183cd819d 100644
--- a/libc/sysdeps/linux/h8300/crt0.S
+++ b/libc/sysdeps/linux/h8300/crt0.S
@@ -53,3 +53,11 @@ empty_func:
.set atexit,empty_func
#endif
+
+/* Stick in a dummy reference to main(), so that if an application
+ * is linking when the main() function is in a static library (.a)
+ * we can be sure that main() actually gets linked in */
+L_dummy_main_reference:
+ .long main
+
+
diff --git a/libc/sysdeps/linux/i386/crt0.S b/libc/sysdeps/linux/i386/crt0.S
index 9e2c101e5..05d2704ba 100644
--- a/libc/sysdeps/linux/i386/crt0.S
+++ b/libc/sysdeps/linux/i386/crt0.S
@@ -77,3 +77,9 @@ _start:
/* Ok, now run uClibc's main() -- shouldn't return */
call __uClibc_main
+/* Stick in a dummy reference to main(), so that if an application
+ * is linking when the main() function is in a static library (.a)
+ * we can be sure that main() actually gets linked in */
+L_dummy_main_reference:
+ .long main
+
diff --git a/libc/sysdeps/linux/i386/crt0.c b/libc/sysdeps/linux/i386/crt0.c
index 6e39caa7c..8e55e5895 100644
--- a/libc/sysdeps/linux/i386/crt0.c
+++ b/libc/sysdeps/linux/i386/crt0.c
@@ -32,6 +32,7 @@ void _start(unsigned int first_arg)
argc = *(stack - 1);
argv = (char **) stack;
envp = (char **)stack + argc + 1;
+ volatile void (*mainp)(int argc,void *argv,void *envp) = main;
__uClibc_main(argc, argv, envp);
}
diff --git a/libc/sysdeps/linux/m68k/crt0.S b/libc/sysdeps/linux/m68k/crt0.S
index 78f3ca8a9..c09146fa5 100644
--- a/libc/sysdeps/linux/m68k/crt0.S
+++ b/libc/sysdeps/linux/m68k/crt0.S
@@ -60,3 +60,10 @@ empty_func:
.set atexit,empty_func
#endif
+
+/* Stick in a dummy reference to main(), so that if an application
+ * is linking when the main() function is in a static library (.a)
+ * we can be sure that main() actually gets linked in */
+L_dummy_main_reference:
+ .long main
+
diff --git a/libc/sysdeps/linux/m68k/crt0.c b/libc/sysdeps/linux/m68k/crt0.c
index 0af108f1e..791b7349b 100644
--- a/libc/sysdeps/linux/m68k/crt0.c
+++ b/libc/sysdeps/linux/m68k/crt0.c
@@ -32,6 +32,7 @@ void _start(unsigned int first_arg)
argc = *(stack - 1);
argv = (char **) stack;
envp = (char **)stack + argc + 1;
+ volatile void (*mainp)(int argc,void *argv,void *envp) = main;
__uClibc_main(argc, argv, envp);
}
diff --git a/libc/sysdeps/linux/mips/crt0.S b/libc/sysdeps/linux/mips/crt0.S
index 000c2901a..9788d54ff 100644
--- a/libc/sysdeps/linux/mips/crt0.S
+++ b/libc/sysdeps/linux/mips/crt0.S
@@ -34,3 +34,9 @@ __start:
jal __uClibc_main
hlt: b hlt /* Crash if somehow it does return. */
+/* Stick in a dummy reference to main(), so that if an application
+ * is linking when the main() function is in a static library (.a)
+ * we can be sure that main() actually gets linked in */
+L_dummy_main_reference:
+ .long main
+
diff --git a/libc/sysdeps/linux/powerpc/crt0.S b/libc/sysdeps/linux/powerpc/crt0.S
index ea71667d3..11738ad5b 100644
--- a/libc/sysdeps/linux/powerpc/crt0.S
+++ b/libc/sysdeps/linux/powerpc/crt0.S
@@ -54,4 +54,10 @@ _start:
add 5,5,0
bl __uClibc_main
-
+
+/* Stick in a dummy reference to main(), so that if an application
+ * is linking when the main() function is in a static library (.a)
+ * we can be sure that main() actually gets linked in */
+L_dummy_main_reference:
+ .long main
+
diff --git a/libc/sysdeps/linux/powerpc/crt0.c b/libc/sysdeps/linux/powerpc/crt0.c
index a2615b02a..f577a5ae1 100644
--- a/libc/sysdeps/linux/powerpc/crt0.c
+++ b/libc/sysdeps/linux/powerpc/crt0.c
@@ -53,6 +53,10 @@ void _start2(void)
p=((void *)p)+0x10;
argc=*(int *)p;
}
+ /* Stick in a dummy reference to main(), so that if an application
+ * is linking when the main() function is in a static library (.a)
+ * we can be sure that main() actually gets linked in */
+ volatile void (*mainp)(int argc,void *argv,void *envp) = main;
__uClibc_main(argc,p+1,p+2+argc);
}
diff --git a/libc/sysdeps/linux/sh/crt0.S b/libc/sysdeps/linux/sh/crt0.S
index 5f67928b8..149fd21cd 100644
--- a/libc/sysdeps/linux/sh/crt0.S
+++ b/libc/sysdeps/linux/sh/crt0.S
@@ -92,4 +92,11 @@ L_main:
L_abort:
.long abort
+/* Stick in a dummy reference to main(), so that if an application
+ * is linking when the main() function is in a static library (.a)
+ * we can be sure that main() actually gets linked in */
+L_dummy_main_reference:
+ .long main
+
.data
+
diff --git a/libc/sysdeps/linux/sparc/crt0.c b/libc/sysdeps/linux/sparc/crt0.c
index 6e39caa7c..323397b6f 100644
--- a/libc/sysdeps/linux/sparc/crt0.c
+++ b/libc/sysdeps/linux/sparc/crt0.c
@@ -32,6 +32,11 @@ void _start(unsigned int first_arg)
argc = *(stack - 1);
argv = (char **) stack;
envp = (char **)stack + argc + 1;
+
+ /* Stick in a dummy reference to main(), so that if an application
+ * is linking when the main() function is in a static library (.a)
+ * we can be sure that main() actually gets linked in */
+ volatile void (*mainp)(int argc,void *argv,void *envp) = main;
__uClibc_main(argc, argv, envp);
}
diff --git a/libc/sysdeps/linux/v850/crt0.S b/libc/sysdeps/linux/v850/crt0.S
index 2013c3b54..676560b20 100644
--- a/libc/sysdeps/linux/v850/crt0.S
+++ b/libc/sysdeps/linux/v850/crt0.S
@@ -50,3 +50,10 @@ C_ENTRY(start):
// should never get here....
jr C_SYMBOL_NAME(abort)
+
+/* Stick in a dummy reference to main(), so that if an application
+ * is linking when the main() function is in a static library (.a)
+ * we can be sure that main() actually gets linked in */
+L_dummy_main_reference:
+ .long main
+