Tim,

Sounds like you are on to something....

The Unix side [1] does a dlclose() to undo a dlsym(). 

I seem to remember this code flow is very very old, I wonder if it is possible 
to do better? For lldb (Xcode) I skipped the LoadLibraryEx()/dlsym() action and 
wrote a debugger script to load symbols. So for Xcode all the code is running 
from the emulator memory, not in an OS context. For lldb I added a breakpoint 
script on SecGdbScriptBreak() that loads symbols. Since the SecGdbScriptBreak() 
is part of the App you get symbols for free, and the break point function can 
access the arguments to SecGdbScriptBreak() to load symbols [3]. Seems like 
this would easily work for gdb too? I'm not sure how easy this is to do in 
VC++, but it seems like we can leverage what ever scripts folks use to load 
symbols on real hardware. 

I'm not 100% sure what is happening on Linux as if you build the code as EFIAPI 
it seems like the dlopen would fail since it is not x86_64 Sys V ABI, and I 
guess it could be falling back to the use the gdb script to load symbols. This 
would Imply for X64 Windows is the odd person out. 

The only downside to "making it real" is you may need to launch pointing at a 
debugger script to get source level debug. 

I know the lldb symbol loading is working as I help Mike test his recent 
patches. 

[1] 
https://github.com/tianocore/edk2/blob/master/EmulatorPkg/Unix/Host/Host.c#L1263
[2] 
https://github.com/tianocore/edk2/blob/master/EmulatorPkg/Unix/Host/Host.c#L1120
[3] 
https://github.com/tianocore/edk2/blob/master/EmulatorPkg/Unix/lldbefi.py#L357

Thanks,

Andrew Fish

> On Aug 21, 2019, at 2:13 PM, Tim Lewis <tim.le...@insyde.com> wrote:
> 
> When running a shell app twice, I ran into an interesting problem: global 
> variables that had initializers were not initialized to the defaults 
> specified in the source. Running the same shell app under the old NT32 seems 
> to work. It turns out that the shell app was not being reloaded, but rather 
> being relaunched. I deduced this from the following behavior:
>
> The value of the global variables was the same as the last known value from 
> the previous invocation.
> The following line in WinHost.c was returning the exact same value for the 
> DLL being loaded
> Library = LoadLibraryEx (DllFileName, NULL, DONT_RESOLVE_DLL_REFERENCES); 
> (around line 901)
> The corresponding code in Nt32’s PeCoffExtractionLib had the following lines 
> in PeCoffLoaderUnloadImageExtraAction
>   VOID *ModHandle;
>
>   ASSERT (ImageContext != NULL);
>   ModHandle = RemoveModeHandle (ImageContext);
>   if (ModHandle != NULL) {
>     mWinNt->FreeLibrary (ModHandle);
>   }
>
> However, the same function in EmulatorPkg’s WinHost.c has:
>
> ASSERT (ImageContext != NULL);
>
> So it appears that the DLL is never being unloaded and the subsequent 
> invocation of the shell app uses the same instance of the DLL, leaving the 
> global variables with the previous values. There are two related functions: 
> AddModHandle and RemoveModHandle.
>
> Am I missing something? Or heading in the right direction? 
>
> Thanks,
> Tim
>
> From: devel@edk2.groups.io <mailto:devel@edk2.groups.io> 
> <devel@edk2.groups.io <mailto:devel@edk2.groups.io>> 
> Sent: Saturday, August 17, 2019 6:30 PM
> To: devel@edk2.groups.io <mailto:devel@edk2.groups.io>
> Subject: [edk2-devel] Upcoming Event: TianoCore Design Meeting - APAC/NAMO - 
> Thu, 08/22/2019 6:30pm-7:30pm #cal-reminder
>
> Reminder: TianoCore Design Meeting - APAC/NAMO
> 
> When: Thursday, 22 August 2019, 6:30pm to 7:30pm, (GMT-07:00) America/Los 
> Angeles 
> 
> Where:https://zoom.us/j/969264410 <https://zoom.us/j/969264410>
> View Event <https://edk2.groups.io/g/devel/viewevent?eventid=470780>
> Organizer: Stephano Cetola stephano.cet...@intel.com 
> <mailto:stephano.cet...@intel.com?subject=Re:%20Event:%20TianoCore%20Design%20Meeting%20-%20APAC%2FNAMO>
> Description:
> 
> Join Zoom Meeting
> https://zoom.us/j/969264410 <https://zoom.us/j/969264410>
>
> One tap mobile
> +16465588656,,969264410# US (New York)
> +17207072699,,969264410# US
>
> Dial by your location
>         +1 646 558 8656 US (New York)
>         +1 720 707 2699 US
> Meeting ID: 969 264 410
> Find your local number: https://zoom.us/u/abOtdJckxL 
> <https://zoom.us/u/abOtdJckxL>
> 


-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.

View/Reply Online (#46182): https://edk2.groups.io/g/devel/message/46182
Mute This Topic: https://groups.io/mt/32983160/21656
Group Owner: devel+ow...@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub  [arch...@mail-archive.com]
-=-=-=-=-=-=-=-=-=-=-=-

Reply via email to