Thank you for the feedback Kilian, your suggestion makes sense unfortunately I am working with GNU toolchain so I don't think I will be able to take advantage of it just yet. Andrew, I have not thought about renaming the libraries, I will give this a try to see if I can get rid of the duplicate symbols, it seems like it should work, thank you very much for that suggestion. Thank you xp On Thu, May 26, 2022 at 12:11 AM Andrew Fish via groups.io wrote: > In edk2 speak Base just means does not depend on any phase of boot, so > basically standalone code. So you can pull a Base lib into SEC, PEI, DXE, > SMM, etc. > > We never interned different Class Names for libs to map to the same > library class when we designed the build system. > > One of the driving factors for the library classes was to not have to > change your vendors driver INF file id you wanted to use a different > instance of the DebugLib etc. > > Thanks, > > Andrew Fish > > > On May 25, 2022, at 9:07 PM, Ethin Probst > wrote: > > > > aren't the Base*Libs there in case you want to override existing > implementations or implement custom versions of them? I'm pretty sure > that's the logic behind it -- its a hack of sorts to try to get OOP out of > a purely procedural language. It works, but I don't think its necessarily > ideal. But there really isn't much of an alternative. Then again, I might > be wrong, too... > > > > On 5/25/22 23:04, Andrew Fish via groups.io wrote: > >>> On May 25, 2022, at 9:23 AM, M.T. xzavierpower@gmail.com>> wrote: > >>> > >>> Hello > >>> > >>> I'm working on a small UEFI shell app. > >>> I was hoping to make use of the JsonLib found in the Redfish Package. > >>> > >>> When I include the Redfish JsonLib and it's dependencies: > >>> JsonLib|RedfishPkg/Library/JsonLib/JsonLib.inf > >>> Ucs2Utf8Lib|RedfishPkg/Library/BaseUcs2Utf8Lib/BaseUcs2Utf8Lib.inf > >>> RedfishCrtLib|RedfishPkg/PrivateLibrary/RedfishCrtLib/RedfishCrtLib.inf > >>> BaseSortLib|MdeModulePkg/Library/BaseSortLib/BaseSortLib.inf > >>> > >>> BaseSortLib has symbol clashes with SortLib resulting in the following: > >>> > >> It looks like BaseSortLib and and SortLib are the same library class so > you should only have one. > >> /Volumes/Case/edk2(master)*>*git grep --recurse-submodules SortLib -- > \*.inf | grep LIBRARY_CLASS > >> MdeModulePkg/Library/BaseSortLib/BaseSortLib.inf:18: LIBRARY_CLASS > = SortLib > >> MdeModulePkg/Library/UefiSortLib/UefiSortLib.inf:18: LIBRARY_CLASS > = SortLib|UEFI_APPLICATION UEFI_DRIVER UEFI_DRIVER > DXE_RUNTIME_DRIVER DXE_DRIVER > >> /Volumes/Case/edk2(master)*>*git grep --recurse-submodules BaseSortLib > -- \*.inc > >> > RedfishPkg/RedfishLibs.dsc.inc:16:*BaseSortLib*|MdeModulePkg/Library/*BaseSortLib*/*BaseSortLib*.inf > >> OK bingo bingo bingo…. > >> The way the edk2 works is you have a library class that maps to the > include file. This is the name in the INF file that resolves linking. You > can have as many instances of the library class as you like. This is why > the DSC files have the | syntax as > you are letting the build pick which instance of the library to use. You > can control this per driver/app if you want. > >> It looks to me like BaseSortLib is an alias for SortLib and that is a > bit of hack. > >> You could try making sure that BaseSortLib and SortLib point to the > same library instance > >> The other option would be to edit RedfishCrtLib.inf and make > BaseSortLib SortLib > >> /Volumes/Case/edk2(master)*>*git grep --recurse-submodules BaseSortLib > -- \*.inf > >> MdeModulePkg/Library/BaseSortLib/BaseSortLib.inf:13: BASE_NAME > = *BaseSortLib* > >> MdeModulePkg/Library/BaseSortLib/BaseSortLib.inf:14: MODULE_UNI_FILE > = *BaseSortLib*.uni > >> MdeModulePkg/Library/BaseSortLib/BaseSortLib.inf:25:*BaseSortLib*.c > >> > RedfishPkg/PrivateLibrary/RedfishCrtLib/RedfishCrtLib.inf:28:*BaseSortLib* > >> I’m note sure why this fake BaseSortLib exists. Looks like we would > need to ask Abner? > >> * > >> * > >> commit 6e9233f968735219b2038c5dd23a46be2c021807 > >> Author: Abner Chang > > >> Date: Fri Dec 4 12:30:05 2020 +0800 > >> RedfishPkg/RedfishCrtLib: Redfish C runtime library > >> Redfish CRT library is currently used by edk2 JsonLib > >> (open source jansson project) and edk2 RedfishLib > >> (libredfish open source project). Redfish CrtLib library > >> provides the necessary C runtime equivalent edk2 functions > >> for open source projects. > >> Signed-off-by: Abner Chang abner.chang@hpe.com>> > >> Cc: Leif Lindholm > > >> Cc: Nickle Wang > > >> Cc: Peter O'Hanley peter.ohanley@hpe.com>> > >> Reviewed-by: Nickle Wang nickle.wang@hpe.com>> > >> Acked-by: Leif Lindholm leif@nuviainc.com>> > >> Reviewed-by: Michael D Kinney michael.d.kinney@intel.com>> > >> * > >> * > >> Thanks, > >> Andrew Fish > >>> /usr/bin/ld: UefiSortLib.obj (symbol from plugin): in function > `PerformQuickSort': > >>> (.text+0x0): multiple definition of `PerformQuickSort'; > BaseSortLib.obj (symbol from plugin):(.text+0x0): first defined here > >>> /usr/bin/ld: UefiSortLib.obj (symbol from plugin): in function > `PerformQuickSort': > >>> (.text+0x0): multiple definition of `DevicePathCompare'; > BaseSortLib.obj (symbol from plugin):(.text+0x0): first defined here > >>> /usr/bin/ld: UefiSortLib.obj (symbol from plugin): in function > `PerformQuickSort': > >>> (.text+0x0): multiple definition of `StringNoCaseCompare'; > BaseSortLib.obj (symbol from plugin):(.text+0x0): first defined here > >>> /usr/bin/ld: UefiSortLib.obj (symbol from plugin): in function > `PerformQuickSort': > >>> (.text+0x0): multiple definition of `StringCompare'; BaseSortLib.obj > (symbol from plugin):(.text+0x0): first defined here > >>> > >>> I need SortLib for UEFIShell dependencies, and I need BaseSortLib for > JsonLib. > >>> Is there some way around this? Or is Redfish meant to be standalone? > >>> > >>> Thank you in advance > >>> xp > >> > > > > > > >