public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
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]
-=-=-=-=-=-=-=-=-=-=-=-



  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