[PATCH u-boot 12/39] string: make memcpy() and memset() visible to fix LTO linking errors
Marek Behun
marek.behun at nic.cz
Mon Mar 8 11:19:33 CET 2021
On Mon, 8 Mar 2021 15:56:01 +0800
Bin Meng <bmeng.cn at gmail.com> wrote:
> Hi Marek,
>
> On Sun, Mar 7, 2021 at 12:26 PM Marek Behún <marek.behun at nic.cz> wrote:
> >
> > 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.
>
> This sounds like a GCC bug of using -fno-builtin and -flto. Could you
> file a bugzilla to GCC people to get some comments?
This is not LTO related. -fno-builtin still generates memcpy() call for
the following code:
typedef struct {
int a[40];
char b[50];
int c[60];
} a;
void cp(a *d, const a *s) {
*d = *s;
}
when compiled with
armv7a-hardfloat-linux-gnueabi-gcc -O2 -fno-builtin -ffreestanding \
-nostdlib -S
it produces code
push {r4, lr}
mov ip, #4096
sub ip, sp, ip
str r0, [ip, #4088]
mov r2, #452
bl memcpy
pop {r4, pc}
.size cp, .-cp
I don't think this is a bug. Or if it is, it is a wontfix. Just
implement memcpy into your code, so that gcc does not have to emit
shitstorms of instructions because of assignment operator :)
Marek
More information about the U-Boot
mailing list