From: "Michael Kubacki" <mikuback@linux.microsoft.com>
To: devel@edk2.groups.io, pedro.falcato@gmail.com
Cc: Michael D Kinney <michael.d.kinney@intel.com>,
Sean Brogan <sean.brogan@microsoft.com>
Subject: Re: [edk2-devel] [PATCH 1/2] UnitTestFrameworkPkg: Fix Google Test components with multiple files
Date: Fri, 1 Dec 2023 12:07:30 -0500 [thread overview]
Message-ID: <3a8ceb26-6fe9-4a1a-96d2-e74f7b3e7baf@linux.microsoft.com> (raw)
In-Reply-To: <20231130224214.86027-2-pedro.falcato@gmail.com>
Hi Pedro,
Visual Studio NOOPT builds result in linker errors. I combined your
patch series with the test instruction change in this PR -
https://github.com/tianocore/edk2/pull/5096.
You can use a PR to test the VS build.
Thanks,
Michael
On 11/30/2023 5:42 PM, Pedro Falcato wrote:
> Google Test hides test registration in global constructors on global
> objects. Global constructors are traditionally implemented by placing
> references to the global constructor's symbol in special sections
> (traditionally named .ctors or .init_array). These sections are not
> explicitly referenced by the linker, and libc only looks at special
> start and end symbols (and calls them).
>
> This works fine if you're linking a program manually using
>
> gcc a.o b.o c.o -o test_suite
>
> but fails miserably when using static libraries (such as what EDK2
> does), because traditional static archive symbol resolution rules don't
> allow for object files to be pulled in to the link if there isn't an
> undefined symbol reference to that .o elsewhere.
>
> Fix it by passing --whole-archive (GCC) and /WHOLEARCHIVE (MSVC). These
> options force the linker to pull in the entire static library, thus
> including previously-unreferenced constructors and making sure
> multi-file gtest EDK2 components work.
>
> BZ: https://bugzilla.tianocore.org/show_bug.cgi?id=4610
> Signed-off-by: Pedro Falcato <pedro.falcato@gmail.com>
> Cc: Michael D Kinney <michael.d.kinney@intel.com>
> Cc: Michael Kubacki <mikuback@linux.microsoft.com>
> Cc: Sean Brogan <sean.brogan@microsoft.com>
> ---
> Note: /WHOLEARCHIVE should work for VS2015 and newer. I haven't been able to
> test it, so if someone could test on msft it would be much appreciated.
> Testing is as simple as taking this patch set
> (https://openfw.io/edk2-devel/20231130024611.67135-1-pedro.falcato@gmail.com/)
> and removing the #include "TestCheckSum.cpp" in TestBaseLibMain.cpp. If everything worked correctly,
> you should have 4 tests and not 0.
>
> UnitTestFrameworkPkg/UnitTestFrameworkPkgHost.dsc.inc | 9 +++++++--
> 1 file changed, 7 insertions(+), 2 deletions(-)
>
> diff --git a/UnitTestFrameworkPkg/UnitTestFrameworkPkgHost.dsc.inc b/UnitTestFrameworkPkg/UnitTestFrameworkPkgHost.dsc.inc
> index 5217de31e491..0f11706e7324 100644
> --- a/UnitTestFrameworkPkg/UnitTestFrameworkPkgHost.dsc.inc
> +++ b/UnitTestFrameworkPkg/UnitTestFrameworkPkgHost.dsc.inc
> @@ -37,7 +37,7 @@
> # MSFT
> #
> MSFT:*_*_*_CC_FLAGS = /EHsc
> - MSFT:*_*_*_DLINK_FLAGS == /out:"$(BIN_DIR)\$(MODULE_NAME_GUID).exe" /pdb:"$(BIN_DIR)\$(MODULE_NAME_GUID).pdb" /IGNORE:4001 /NOLOGO /SUBSYSTEM:CONSOLE /DEBUG /STACK:0x40000,0x40000 /NODEFAULTLIB:libcmt.lib libcmtd.lib
> + MSFT:*_*_*_DLINK_FLAGS == /out:"$(BIN_DIR)\$(MODULE_NAME_GUID).exe" /pdb:"$(BIN_DIR)\$(MODULE_NAME_GUID).pdb" /IGNORE:4001 /NOLOGO /SUBSYSTEM:CONSOLE /DEBUG /STACK:0x40000,0x40000 /NODEFAULTLIB:libcmt.lib libcmtd.lib /WHOLEARCHIVE
> MSFT:*_*_IA32_DLINK_FLAGS = /MACHINE:I386
> MSFT:*_*_X64_DLINK_FLAGS = /MACHINE:AMD64
>
> @@ -56,7 +56,12 @@
> #
> GCC:*_*_IA32_DLINK_FLAGS == -o $(BIN_DIR)/$(MODULE_NAME_GUID) -m32 -no-pie
> GCC:*_*_X64_DLINK_FLAGS == -o $(BIN_DIR)/$(MODULE_NAME_GUID) -m64 -no-pie
> - GCC:*_*_*_DLINK2_FLAGS == -lgcov -lpthread -lstdc++ -lm
> + #
> + # Surround our static libraries with whole-archive, so constructor-based test registration works properly.
> + # Note that we need to --no-whole-archive before linking system libraries.
> + #
> + GCC:*_*_*_DLINK_FLAGS = -Wl,--whole-archive
> + GCC:*_*_*_DLINK2_FLAGS == -Wl,--no-whole-archive -lgcov -lpthread -lstdc++ -lm
>
> #
> # Need to do this link via gcc and not ld as the pathing to libraries changes from OS version to OS version
-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#111983): https://edk2.groups.io/g/devel/message/111983
Mute This Topic: https://groups.io/mt/102904623/7686176
Group Owner: devel+owner@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [rebecca@openfw.io]
-=-=-=-=-=-=-=-=-=-=-=-
next prev parent reply other threads:[~2023-12-01 17:07 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-11-30 22:42 [edk2-devel] [PATCH 0/2] UnitTestFrameworkPkg: Fix Google Test components with multiple files Pedro Falcato
2023-11-30 22:42 ` [edk2-devel] [PATCH 1/2] " Pedro Falcato
2023-12-01 17:07 ` Michael Kubacki [this message]
2023-12-01 20:50 ` Pedro Falcato
[not found] ` <179CD05BE5E43398.18076@groups.io>
2023-12-01 20:52 ` Pedro Falcato
2023-12-01 21:28 ` Michael D Kinney
2023-12-03 0:34 ` Michael D Kinney
2023-12-03 2:37 ` Michael D Kinney
2023-12-03 12:11 ` Pedro Falcato
2023-11-30 22:42 ` [edk2-devel] [PATCH 2/2] UnitTestFrameworkPkg/Readme.md: Remove the mention of the gtest main() limitation Pedro Falcato
2023-12-01 17:10 ` Michael Kubacki
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-list from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=3a8ceb26-6fe9-4a1a-96d2-e74f7b3e7baf@linux.microsoft.com \
--to=devel@edk2.groups.io \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox