Fish: From: afish@apple.com [mailto:afish@apple.com] Sent: Thursday, June 6, 2019 11:39 AM To: devel@edk2.groups.io; Lu, XiaoyuX Cc: Gao, Liming ; Bi, Dandan ; Wang, Jian J Subject: Re: [edk2-devel] [PATCH v1 1/1] CryptoPkg/IntrinsicLib: Fix CLANG38 IA32 build problem 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. OK. It is for CLANG 3.8. I will check whether the latest CLANG8.0 fixes it. 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