[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Minios-devel] [UNIKRAFT PATCH 2/2] lib/ukboot: move weak main in separate sub-lib
Link Time Optimization does not work well with incremental linking (ld -r), which is heavily used by Unikraft. The ukboot has a weak main() function, which is supposed to be called if no other library/application provided a proper main. However gcc resolves main() to whatever is available while linking the libukboot.ld.o. Which is the weak one. In the upcoming gcc v9 release a better support of incremental link optimization is announced. Which hopefully will fix this issue. But for now, let's fix it with a workaround. Let's create a sublib under the ukboot, containing only the weak main. This way we will leave no chance for the first "ld -r" to link with the wrong main. The next "ld -r" will have all the objects, so it will be able to make correct decision. Signed-off-by: Yuri Volchkov <yuri.volchkov@xxxxxxxxx> --- lib/ukboot/Makefile.uk | 12 ++++++++++++ lib/ukboot/boot.c | 7 ------- lib/ukboot/weak_main.c | 9 +++++++++ 3 files changed, 21 insertions(+), 7 deletions(-) create mode 100644 lib/ukboot/weak_main.c diff --git a/lib/ukboot/Makefile.uk b/lib/ukboot/Makefile.uk index 2b7f69f..55f205d 100644 --- a/lib/ukboot/Makefile.uk +++ b/lib/ukboot/Makefile.uk @@ -4,3 +4,15 @@ CINCLUDES-$(CONFIG_LIBUKBOOT) += -I$(LIBUKBOOT_BASE)/include CXXINCLUDES-$(CONFIG_LIBUKBOOT) += -I$(LIBUKBOOT_BASE)/include LIBUKBOOT_SRCS-y += $(LIBUKBOOT_BASE)/boot.c + +# The main() is in the separate library to fool the LTO. Which is +# trying to resolve the main() function call to whatever is available +# during liking the library object file. And this will be the weak +# main. So even if the proper main() is provided later, the weak one +# will be called, because the decision is already made. +# +# This does not sound right, but LTO does not work well with +# incremental linking (ld -r). This possibly will be fixed in gcc +# v9. But we have to deal with it now. +$(eval $(call addlib_s,libukboot_main,$(CONFIG_LIBUKBOOT))) +LIBUKBOOT_MAIN_SRCS-y += $(LIBUKBOOT_BASE)/weak_main.c diff --git a/lib/ukboot/boot.c b/lib/ukboot/boot.c index 174dd5b..4846782 100644 --- a/lib/ukboot/boot.c +++ b/lib/ukboot/boot.c @@ -266,10 +266,3 @@ void ukplat_entry(int argc, char *argv[]) main_thread_func(&tma); #endif } - -/* Internal main */ -int main(int argc __unused, char *argv[] __unused) -{ - printf("weak main() called. Symbol was not replaced!\n"); - return -EINVAL; -} diff --git a/lib/ukboot/weak_main.c b/lib/ukboot/weak_main.c new file mode 100644 index 0000000..697720c --- /dev/null +++ b/lib/ukboot/weak_main.c @@ -0,0 +1,9 @@ +#include <stdio.h> +#include <errno.h> + +/* Internal main */ +int __weak main(int argc __unused, char *argv[] __unused) +{ + printf("weak main() called. Symbol was not replaced!\n"); + return -EINVAL; +} -- 2.19.2 _______________________________________________ Minios-devel mailing list Minios-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/minios-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |