Library Class và Library Instance là gì?
Quicknote giải thích Library Class/Instance trong EDK II.
Trong EDK II, Library Class là interface logic mà module muốn dùng, còn Library Instance là implementation cụ thể được platform chọn trong DSC.
Điểm quan trọng: module thường không link trực tiếp tới một .lib cố định. Nó khai báo “tôi cần DebugLib”, còn platform quyết định dùng BaseDebugLibSerialPort, BaseDebugLibNull, hay implementation khác.
Gọi hàm library
DEBUG(), CopyMem(), BoardConfigGetGpioTable().
Khai báo LibraryClass
Module nói mình cần DebugLib, BaseMemoryLib, BoardConfigLib...
Map sang Library Instance
Platform chọn implementation cụ thể.
Resolve symbol
Implementation được link vào module.
Ví dụ thực tế: gọi hàm của module/library khác
Trong C:
#include <Library/BoardConfigLib.h>
CONST BOARD_GPIO_TABLE *Table;
Table = BoardConfigGetGpioTable ();
Trong INF của module consume:
[Packages]
MdePkg/MdePkg.dec
MyPkg/MyPkg.dec
[LibraryClasses]
UefiDriverEntryPoint
DebugLib
BoardConfigLib
Trong DSC:
[LibraryClasses]
BoardConfigLib|MyPkg/Library/BoardConfigLib/BoardConfigLib.inf
Trong library instance INF:
[Defines]
MODULE_TYPE = BASE
LIBRARY_CLASS = BoardConfigLib|DXE_DRIVER UEFI_APPLICATION
Nếu LIBRARY_CLASS không support module type hiện tại, build có thể không chọn được instance phù hợp.
Các lỗi thường gặp
| Mục | Giá trị | Ghi chú |
|---|---|---|
| Header not found | Thiếu package/DEC | Header public chưa được expose hoặc INF chưa thêm package. |
| Library class not found | INF thiếu LibraryClass | Module đang gọi hàm nhưng không khai báo library interface. |
| Instance not found | DSC chưa map instance | Platform chưa chọn implementation cụ thể. |
| Unresolved external symbol | Mapping/library source sai | Có khai báo nhưng implementation không cung cấp symbol cần link. |
| Wrong phase library | Dùng nhầm PEI/DXE/SMM library | Một số library chỉ hợp lệ trong phase/module type nhất định. |
Vì sao cơ chế này hay?
Cùng một module có thể dùng DebugLib, nhưng platform DEBUG dùng serial log, platform RELEASE dùng null log. Source module không cần đổi.
# DEBUG build
DebugLib|MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf
# RELEASE build
DebugLib|MdePkg/Library/BaseDebugLibNull/BaseDebugLibNull.inf
Đây là một kiểu “dependency injection” ở thời điểm build của EDK II.
Checklist LibraryClass
Ghi nhớ nhanh
Library Class = module cần năng lực gì. Library Instance = platform chọn implementation nào. Khi gặp link error trong EDK II, hãy kiểm tra chuỗi này trước khi nghi ngờ compiler.
Bài liên quan
Nguồn tham khảo public
Thấy nội dung này hữu ích?
Lưu lại hoặc chia sẻ cho người cũng đang học firmware, BIOS/UEFI và embedded systems.
Nội dung liên quan
Một số bài viết, ghi chú hoặc project có liên quan đến nội dung bạn vừa đọc.
Biến note thành bài viết hoàn chỉnh
Notes là nơi ghi nhanh khái niệm.