[edk2-devel] What is a "NULL" library class?

Nate DeSimone nathaniel.l.desimone at intel.com
Fri Jan 29 01:42:58 UTC 2021


Hi There,

First of all, welcome!

So, “NULL” library classes are conceptually an "anonymous library". It enables one to statically link code into a module even if the module doesn't directly call functions in that library. All libraries, both regular libraries with a declared LibraryClass as well as these anonymous libraries, can publish both a constructor and a destructor. The EDK II build system will automatically generate a small amount of C code that invokes all library constructors before the entry point for the module is invoked, and all destructors after the entry point returns. This is useful for building statically linked plug-ins.

I think my favorite example of this in-action is the UEFI Shell, here is what a typical DSC declaration for the UEFI Shell looks like:

ShellPkg/Application/Shell/Shell.inf {
  <PcdsFixedAtBuild>
    gEfiShellPkgTokenSpaceGuid.PcdShellLibAutoInitialize|FALSE
  <LibraryClasses>
    NULL|ShellPkg/Library/UefiShellLevel1CommandsLib/UefiShellLevel1CommandsLib.inf
    NULL|ShellPkg/Library/UefiShellLevel2CommandsLib/UefiShellLevel2CommandsLib.inf
    NULL|ShellPkg/Library/UefiShellLevel3CommandsLib/UefiShellLevel3CommandsLib.inf
    NULL|ShellPkg/Library/UefiShellDriver1CommandsLib/UefiShellDriver1CommandsLib.inf
    NULL|ShellPkg/Library/UefiShellInstall1CommandsLib/UefiShellInstall1CommandsLib.inf
    NULL|ShellPkg/Library/UefiShellDebug1CommandsLib/UefiShellDebug1CommandsLib.inf
    NULL|ShellPkg/Library/UefiShellNetwork1CommandsLib/UefiShellNetwork1CommandsLib.inf
    NULL|ShellPkg/Library/UefiShellNetwork2CommandsLib/UefiShellNetwork2CommandsLib.inf
    ShellCommandLib|ShellPkg/Library/UefiShellCommandLib/UefiShellCommandLib.inf
    HandleParsingLib|ShellPkg/Library/UefiHandleParsingLib/UefiHandleParsingLib.inf
    BcfgCommandLib|ShellPkg/Library/UefiShellBcfgCommandLib/UefiShellBcfgCommandLib.inf
    ShellCEntryLib|ShellPkg/Library/UefiShellCEntryLib/UefiShellCEntryLib.inf
    ShellLib|ShellPkg/Library/UefiShellLib/UefiShellLib.inf
}

If you take a look at ShellPkg/Library/UefiShellLevel1CommandsLib/UefiShellLevel1CommandsLib.inf, you will see that the constructor for that anonymous library is named ShellLevel1CommandsLibConstructor(). Now, let's go and look at the definition for ShellLevel1CommandsLibConstructor() in ShellPkg/Library/UefiShellLevel1CommandsLib/UefiShellLevel1CommandsLib.c and note the following code snippet:

ShellCommandRegisterCommandName(L"stall",  ShellCommandRunStall   ...
ShellCommandRegisterCommandName(L"for",    ShellCommandRunFor     ...
ShellCommandRegisterCommandName(L"goto",   ShellCommandRunGoto    ...
ShellCommandRegisterCommandName(L"if",     ShellCommandRunIf      ...
ShellCommandRegisterCommandName(L"shift",  ShellCommandRunShift   ...
ShellCommandRegisterCommandName(L"exit",   ShellCommandRunExit    ...
ShellCommandRegisterCommandName(L"else",   ShellCommandRunElse    ...
ShellCommandRegisterCommandName(L"endif",  ShellCommandRunEndIf   ...
ShellCommandRegisterCommandName(L"endfor", ShellCommandRunEndFor  ...

This library is installing new commands into the UEFI shell during its initialization procedure. This allows one to add custom commands to the shell as statically linked built-ins. A typical use case would be implementing platform specific diagnostic/recovery utilities.

Hope that helps!
Nate

> From: devel at edk2.groups.io <devel at edk2.groups.io> On Behalf Of wonderfly at waymo.com
> Sent: Thursday, January 28, 2021 10:22 AM
> To: devel at edk2.groups.io
> Subject: [edk2-devel] What is a "NULL" library class?
> 
> Hi,
> 
> I am super new to EDK2 development so excuse my ignorance.  While browsing the code base I find a lot places where the keyword "NULL" is used in place of a LibraryClass, specifically in DSC files.  For example,
> in edk2/UefiPayloadPkg/UefiPayloadPkgIa32.dsc:                                                                       
>   MdeModulePkg/Core/Dxe/DxeMain.inf {
>     <LibraryClasses>
>       NULL|MdeModulePkg/Library/LzmaCustomDecompressLib/LzmaCustomDecompressLib.inf
>   }
> 
> What does this mean?  Does it mean that the LzmaCustomDecompressLib.inf library instance is unconditionally linked for this package?
> 


-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#70879): https://edk2.groups.io/g/devel/message/70879
Mute This Topic: https://groups.io/mt/80192232/1813853
Group Owner: devel+owner at edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [edk2-devel-archive at redhat.com]
-=-=-=-=-=-=-=-=-=-=-=-






More information about the edk2-devel-archive mailing list