[PATCH u-boot 12/39] string: make memcpy() and memset() visible to fix LTO linking errors
Marek Behún
marek.behun at nic.cz
Sun Mar 7 05:25:11 CET 2021
It seems that sometimes (happening on ARM64, for example with
turris_mox_defconfig) GCC, when linking with LTO, changes the symbol
names of some functions, for example lib/string.c's memcpy() function to
memcpy.isra.0.
This is a problem however when GCC for a code such as this:
struct some_struct *info = get_some_struct();
struct some struct tmpinfo;
tmpinfo = *info;
emits a call to memcpy() by builtin behaviour, to copy *info to tmpinfo.
memset() can be generated sometimes as well.
This then results in the following linking error:
.../lz4.c:93: undefined reference to `memcpy'
.../uuid.c:206: more undefined references to `memcpy' follow
Make memcpy() and memset() visible by using the __used macro to avoid
this error.
Signed-off-by: Marek Behún <marek.behun at nic.cz>
---
lib/string.c | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/lib/string.c b/lib/string.c
index 73b984123d..bfda3952ee 100644
--- a/lib/string.c
+++ b/lib/string.c
@@ -16,6 +16,7 @@
*/
#include <config.h>
+#include <linux/compiler.h>
#include <linux/types.h>
#include <linux/string.h>
#include <linux/ctype.h>
@@ -490,7 +491,7 @@ char *strswab(const char *s)
*
* Do not use memset() to access IO space, use memset_io() instead.
*/
-void * memset(void * s,int c,size_t count)
+__used void * memset(void * s,int c,size_t count)
{
unsigned long *sl = (unsigned long *) s;
char *s8;
@@ -529,7 +530,7 @@ void * memset(void * s,int c,size_t count)
* You should not use this function to access IO space, use memcpy_toio()
* or memcpy_fromio() instead.
*/
-void * memcpy(void *dest, const void *src, size_t count)
+__used void * memcpy(void *dest, const void *src, size_t count)
{
unsigned long *dl = (unsigned long *)dest, *sl = (unsigned long *)src;
char *d8, *s8;
--
2.26.2
More information about the U-Boot
mailing list