> On Jun 4, 2019, at 11:33 PM, Xiaoyu Lu wrote: > > Hi Liming, > >> -----Original Message----- >> From: Gao, Liming >> Sent: Wednesday, June 5, 2019 1:57 PM >> To: devel@edk2.groups.io ; Lu, XiaoyuX > >> Cc: Bi, Dandan >; Wang, Jian J > >> Subject: RE: [edk2-devel] [PATCH v1 1/1] CryptoPkg/IntrinsicLib: Fix >> CLANG38 IA32 build problem >> >> Xiaoyu: >> >>> -----Original Message----- >>> From: devel@edk2.groups.io [mailto:devel@edk2.groups.io] On Behalf Of >>> Xiaoyu Lu >>> Sent: Wednesday, June 05, 2019 1:25 PM >>> To: devel@edk2.groups.io >>> Cc: Lu, XiaoyuX ; Bi, Dandan >> ; >>> Wang, Jian J >>> Subject: [edk2-devel] [PATCH v1 1/1] CryptoPkg/IntrinsicLib: Fix CLANG38 >>> IA32 build problem >>> >>> When use clang-3.8 to build the NetworkPkg, compiler optimization >>> may use memcpy for memory copy. For example: >>> >>> CryptoPkg/Library/OpensslLib/openssl/ssl/ssl_rsa.c:918: undefined >>> reference to `memcpy'` >>> >>> Compiler optimization is sophisticated, but we can work around it >>> use __attribute__((__used__)) to informs the compiler that symbol >>> should be retained in the object file, even if it may be >>> unreferenced. >>> >>> Cc: Jian J Wang >>> Cc: Dandan Bi >>> Signed-off-by: Xiaoyu Lu >>> --- >>> CryptoPkg/Library/IntrinsicLib/CopyMem.c | 13 +++++++++++++ >>> 1 file changed, 13 insertions(+) >>> >>> diff --git a/CryptoPkg/Library/IntrinsicLib/CopyMem.c >>> b/CryptoPkg/Library/IntrinsicLib/CopyMem.c >>> index e29b4918d200..7faf5a34d8c1 100644 >>> --- a/CryptoPkg/Library/IntrinsicLib/CopyMem.c >>> +++ b/CryptoPkg/Library/IntrinsicLib/CopyMem.c >>> @@ -10,8 +10,21 @@ SPDX-License-Identifier: BSD-2-Clause-Patent >>> #include >>> #include >>> >>> +#if defined(__clang__) && !defined(__APPLE__) >> >> So, this change is only for CLANG tool chain. >> >>> + >>> +/* Copies bytes between buffers */ >>> +static __attribute__((__used__)) >> >> What purpose for static? >> > > Because I want __memcpy only use in this file scope. > >>> +void * __memcpy (void *dest, const void *src, unsigned int count) >>> +{ >>> + return CopyMem (dest, src, (UINTN)count); >>> +} >>> +__attribute__((__alias__("__memcpy"))) >>> +void * memcpy (void *dest, const void *src, unsigned int count); >> >> __memcpy is IA32 Intrinsic API, memcpy is X64 Intrinsic API, right? >> > > __memcpy isn't IA32 Intrinsic API, only memcpy is intrinsic API for both IA32 and X64. > > The reason I alias memcpy and use __attribute__((__used__)) is let compiler retain symbol in object file, > So it can link correct. > > Is this correct? > I think this is a bug in clang that requires the __used__, we hit something like this with Xcode too. If the compiler emits the intrinsic it should tell the linker and some how that was getting missed. Thus the __used__ is a work around. Thanks, Andrew Fish >> Thanks >> Liming > >>> + >>> +#else >>> /* Copies bytes between buffers */ >>> void * memcpy (void *dest, const void *src, unsigned int count) >>> { >>> return CopyMem (dest, src, (UINTN)count); >>> } >>> +#endif >>> -- >>> 2.7.4 >>> >>> >>> > > >