同时引入LibC与OpensslLib时EDK2应用编译失败:stdatomic.h未找到
EDK2 ShellPkg编译错误:引入StdLib与OpenSSL时缺失stdatomic.h
问题场景
我正在修改EDK2的ShellPkg应用,通过硬编码参数启动特定EFI应用,目标是用OpenSSL验证待启动应用的合法性,使用版本为edk2-stable202305。具体实现是用StdLib的fopen打开文件,再调用EDK2 OpensslLib的Sha256Init、Sha256Update、Sha256Final方法校验哈希值。
执行编译命令:
build -p ShellPkg/ShellPkg.dsc -t GCC5 -a X64 -b RELEASE
出现以下错误:
In file included from /home/zjeffer/git/edk2/edk2/CryptoPkg/Library/OpensslLib/openssl/include/crypto/evp.h:11, from /home/zjeffer/git/edk2/edk2/CryptoPkg/Library/OpensslLib/openssl/crypto/asn1/a_sign.c:22: /home/zjeffer/git/edk2/edk2/CryptoPkg/Library/OpensslLib/openssl/include/internal/refcount.h:21:12: fatal error: stdatomic.h: No such file or directory # include <stdatomic.h> ^~~~~~~~~~~~~ compilation terminated. make: *** [GNUmakefile:1444: /home/zjeffer/git/edk2/edk2/Build/Shell/RELEASE_GCC5/X64/CryptoPkg/Library/OpensslLib/OpensslLibCrypto/OUTPUT/openssl/crypto/asn1/a_sign.obj] Error 1 @/home/zjeffer/git/edk2/edk2/Build/Shell/RELEASE_GCC5/X64/CryptoPkg/Library/OpensslLib/OpensslLibCrypto/OUTPUT/cc_resp.txt -g -Os -fshort-wchar -fno-builtin -fno-strict-aliasing -Wall -Werror -Wno-array-bounds -include AutoGen.h -fno-common -ffunction-sections -fdata-sections -DSTRING_ARRAY_NAME=OpensslLibCryptoStrings -m64 -fno-stack-protector "-DEFIAPI=__attribute__((ms_abi))" -maccumulate-outgoing-args -mno-red-zone -Wno-address -mcmodel=small -fpie -fno-asynchronous-unwind-tables -Wno-address -fno-omit-frame-pointer -flto -DUSING_LTO -Wno-unused-but-set-variable -Wno-unused-const-variable -U_WIN32 -U_WIN64 -DL_ENDIAN -DOPENSSL_SMALL_FOOTPRINT -D_CRT_SECURE_NO_DEPRECATE -D_CRT_NONSTDC_NO_DEPRECATE -DOPENSSL_NO_EC -DOPENSSL_NO_ECDH -DOPENSSL_NO_ECDSA -DOPENSSL_NO_TLS1_3 -DOPENSSL_NO_SM2 -DOPENSSL_NO_ASM -Wno-error=maybe-uninitialized -Wno-error=format -Wno-format -Wno-error=unused-but-set-variable -DNO_MSABI_VA_FUNCS -Wno-unused-but-set-variable -D DISABLE_NEW_DEPRECATED_INTERFACES -nostdinc -nostdlib -DUEFI_C_SOURCE -I/home/zjeffer/git/edk2/edk2/CryptoPkg/Library/OpensslLib/openssl/crypto/store -I/home/zjeffer/git/edk2/edk2/CryptoPkg/Library/OpensslLib/openssl/crypto/x509v3 -I/home/zjeffer/git/edk2/edk2/CryptoPkg/Library/OpensslLib/openssl/crypto/x509 -I/home/zjeffer/git/edk2/edk2/CryptoPkg/Library/OpensslLib/openssl/crypto/ui -I/home/zjeffer/git/edk2/edk2/CryptoPkg/Library/OpensslLib/openssl/crypto/txt_db -I/home/zjeffer/git/edk2/edk2/CryptoPkg/Library/OpensslLib/openssl/crypto/stack -I/home/zjeffer/git/edk2/edk2/CryptoPkg/Library/OpensslLib/openssl/crypto/sm4 -I/home/zjeffer/git/edk2/edk2/CryptoPkg/Library/OpensslLib/openssl/crypto/sm3 -I/home/zjeffer/git/edk2/edk2/CryptoPkg/Library/OpensslLib/openssl/crypto/siphash -I/home/zjeffer/git/edk2/edk2/CryptoPkg/Library/OpensslLib/openssl/crypto/sha -I/home/zjeffer/git/edk2/edk2/CryptoPkg/Library/OpensslLib/openssl/crypto/rsa -I/home/zjeffer/git/edk2/edk2/CryptoPkg/Library/OpensslLib/openssl/crypto/rand -I/home/zjeffer/git/edk2/edk2/CryptoPkg/Library/OpensslLib/openssl/crypto/pkcs7 -I/home/zjeffer/git/edk2/edk2/CryptoPkg/Library/OpensslLib/openssl/crypto/pkcs12 -I/home/zjeffer/git/edk2/edk2/CryptoPkg/Library/OpensslLib/openssl/crypto/pem -I/home/zjeffer/git/edk2/edk2/CryptoPkg/Library/OpensslLib/openssl/crypto/ocsp -I/home/zjeffer/git/edk2/edk2/CryptoPkg/Library/OpensslLib/openssl/crypto/objects -I/home/zjeffer/git/edk2/edk2/CryptoPkg/Library/OpensslLib/openssl/crypto/modes -I/home/zjeffer/git/edk2/edk2/CryptoPkg/Library/OpensslLib/openssl/crypto/md5 -I/home/zjeffer/git/edk2/edk2/CryptoPkg/Library/OpensslLib/openssl/crypto/lhash -I/home/zjeffer/git/edk2/edk2/CryptoPkg/Library/OpensslLib/openssl/crypto/kdf -I/home/zjeffer/git/edk2/edk2/CryptoPkg/Library/OpensslLib/openssl/crypto/hmac -I/home/zjeffer/git/edk2/edk2/CryptoPkg/Library/OpensslLib/openssl/crypto/evp -I/home/zjeffer/git/edk2/edk2/CryptoPkg/Library/OpensslLib/openssl/crypto/err -I/home/zjeffer/git/edk2/edk2/CryptoPkg/Library/OpensslLib/openssl/crypto/dso -I/home/zjeffer/git/edk2/edk2/CryptoPkg/Library/OpensslLib/openssl/crypto/dh -I/home/zjeffer/git/edk2/edk2/CryptoPkg/Library/OpensslLib/openssl/crypto -I/home/zjeffer/git/edk2/edk2/CryptoPkg/Library/OpensslLib/openssl/crypto/conf -I/home/zjeffer/git/edk2/edk2/CryptoPkg/Library/OpensslLib/openssl/crypto/comp -I/home/zjeffer/git/edk2/edk2/CryptoPkg/Library/OpensslLib/openssl/crypto/cmac -I/home/zjeffer/git/edk2/edk2/CryptoPkg/Library/OpensslLib/openssl/crypto/buffer -I/home/zjeffer/git/edk2/edk2/CryptoPkg/Library/OpensslLib/openssl/crypto/bn -I/home/zjeffer/git/edk2/edk2/CryptoPkg/Library/OpensslLib/openssl/crypto/bio -I/home/zjeffer/git/edk2/edk2/CryptoPkg/Library/OpensslLib/openssl/crypto/async -I/home/zjeffer/git/edk2/edk2/CryptoPkg/Library/OpensslLib/openssl/crypto/async/arch -I/home/zjeffer/git/edk2/edk2/CryptoPkg/Library/OpensslLib/openssl/crypto/asn1 -I/home/zjeffer/git/edk2/edk2/CryptoPkg/Library/OpensslLib/openssl/crypto/aria -I/home/zjeffer/git/edk2/edk2/CryptoPkg/Library/OpensslLib/openssl/crypto/aes -I/home/zjeffer/git/edk2/edk2/CryptoPkg/Library/OpensslLib/openssl/ms -I/home/zjeffer/git/edk2/edk2/CryptoPkg/Library/OpensslLib/openssl -I/home/zjeffer/git/edk2/edk2/CryptoPkg/Library/OpensslLib -I/home/zjeffer/git/edk2/edk2/Build/Shell/RELEASE_GCC5/X64/CryptoPkg/Library/OpensslLib/OpensslLibCrypto/DEBUG -I/home/zjeffer/git/edk2/edk2/MdePkg -I/home/zjeffer/git/edk2/edk2/MdePkg/Include -I/home/zjeffer/git/edk2/edk2/MdePkg/Test/UnitTest/Include -I/home/zjeffer/git/edk2/edk2/MdePkg/Test/Mock/Include -I/home/zjeffer/git/edk2/edk2/MdePkg/Library/MipiSysTLib/mipisyst/library/include -I/home/zjeffer/git/edk2/edk2/MdePkg/Include/X64 -I/home/zjeffer/git/edk2/edk2/CryptoPkg -I/home/zjeffer/git/edk2/edk2/CryptoPkg/Include -I/home/zjeffer/git/edk2/edk2/CryptoPkg/Private -I/home/zjeffer/git/edk2/edk2/CryptoPkg/Library/Include -I/home/zjeffer/git/edk2/edk2/CryptoPkg/Library/OpensslLib/openssl/include build.py... : error 7000: Failed to execute command make tbuild [/home/zjeffer/git/edk2/edk2/Build/Shell/RELEASE_GCC5/X64/CryptoPkg/Library/OpensslLib/OpensslLibCrypto] build.py... : error 7000: Failed to execute command make tbuild [/home/zjeffer/git/edk2/edk2/Build/Shell/RELEASE_GCC5/X64/CryptoPkg/Library/BaseCryptLib/BaseCryptLib] build.py... : error F002: Failed to build module /home/zjeffer/git/edk2/edk2/CryptoPkg/Library/OpensslLib/OpensslLibCrypto.inf [X64, GCC5, RELEASE] - Failed -
修改的文件内容
Shell.inf修改
[Packages] MdePkg/MdePkg.dec ShellPkg/ShellPkg.dec MdeModulePkg/MdeModulePkg.dec StdLib/StdLib.dec CryptoPkg/CryptoPkg.dec [LibraryClasses] BaseLib UefiApplicationEntryPoint UefiLib DebugLib MemoryAllocationLib ShellCommandLib UefiRuntimeServicesTableLib UefiBootServicesTableLib DevicePathLib BaseMemoryLib PcdLib FileHandleLib PrintLib HiiLib SortLib HandleParsingLib UefiHiiServicesLib LibC LibStdio LibStdLib LibString LibWchar BaseCryptLib OpensslLib MemoryAllocationLib
ShellPkg.dsc修改
- 添加
!include StdLib/StdLib.inc引入StdLib - 在
[LibraryClasses.common]下添加以下库:
BaseLib|MdePkg/Library/BaseLib/BaseLib.inf BaseMemoryLib|MdePkg/Library/BaseMemoryLib/BaseMemoryLib.inf BaseCryptLib|CryptoPkg/Library/BaseCryptLib/BaseCryptLib.inf DevicePathLib|MdePkg/Library/UefiDevicePathLib/UefiDevicePathLib.inf SafeIntLib|MdePkg/Library/BaseSafeIntLib/BaseSafeIntLib.inf SynchronizationLib|MdePkg/Library/BaseSynchronizationLib/BaseSynchronizationLib.inf TimerLib|MdePkg/Library/BaseTimerLibNullTemplate/BaseTimerLibNullTemplate.inf RngLib|MdePkg/Library/BaseRngLib/BaseRngLib.inf OemHookStatusCodeLib|MdeModulePkg/Library/OemHookStatusCodeLibNull/OemHookStatusCodeLibNull.inf HashApiLib|CryptoPkg/Library/BaseHashApiLib/BaseHashApiLib.inf IntrinsicLib|CryptoPkg/Library/IntrinsicLib/IntrinsicLib.inf MemoryAllocationLib|MdePkg/Library/UefiMemoryAllocationLib/UefiMemoryAllocationLib.inf # 不知道该用哪一个,两个都会触发错误 # OpensslLib|CryptoPkg/Library/OpensslLib/OpensslLib.inf OpensslLib|CryptoPkg/Library/OpensslLib/OpensslLibCrypto.inf
关键现象与补充信息
- 无论是否在Shell.c中引入OpenSSL库,都会触发该错误
- 单独编译CryptoPkg(命令
build -p CryptoPkg/CryptoPkg.dsc -t GCC5 -b RELEASE -a X64)无问题 - 使用gcc 8.3.0和11.3.0均出现相同错误
- 移除StdLib包则编译正常,但业务需要保留该库
- 引入StdLib并定义
__STDC_NO_ATOMICS__时,出现大量多重定义错误,示例:
/usr/bin/ld: MemoryIntrinsics.obj (symbol from plugin): in function `memset': (.text+0x0): multiple definition of `memset'; Misc.obj (symbol from plugin):(.text+0x0): first defined here /usr/bin/ld: MemoryIntrinsics.obj (symbol from plugin): in function `memset': (.text+0x0): multiple definition of `memcmp'; Comparison.obj (symbol from plugin):(.text+0x0): first defined here
内容的提问来源于stack exchange,提问作者zjeffer
相关产品推荐
相关产品推荐

