You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

同时引入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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 14:11:59