On 2015-12-05 22:26:53, Ard Biesheuvel wrote:
> On 6 December 2015 at 01:44, Jordan Justen <[email protected]> wrote:
> > On 2015-12-04 11:21:18, Ard Biesheuvel wrote:
> >> On 4 December 2015 at 20:13, Jordan Justen <[email protected]> 
> >> wrote:
> >> > On 2015-12-04 08:43:29, Ard Biesheuvel wrote:
> >> >> On 4 December 2015 at 17:27, Laszlo Ersek <[email protected]> wrote:
> >> >> > On 12/04/15 17:23, Paolo Bonzini wrote:
> >> >> >>
> >> >> >>
> >> >> >> On 04/12/2015 11:39, Laszlo Ersek wrote:
> >> >> >>> (4) Linking those two files into a complete program is a violation 
> >> >> >>> of
> >> >> >>> "6.7 External definitions":
> >> >> >>>
> >> >> >>>     [...] If an identifier declared with external linkage is used 
> >> >> >>> in an
> >> >> >>>     expression (other than as part of the operand of a *sizeof*
> >> >> >>>     operator), somewhere in the entire program there shall be 
> >> >> >>> exactly
> >> >> >>>     one external definition for the identifier [...]
> >> >> >>>
> >> >> >>> Again, how does the argument go?
> >> >> >>>
> >> >> >>> - In each file we have exactly one tentative definition, and no
> >> >> >>>   declaration that would be, in its own right, an external 
> >> >> >>> definition.
> >> >> >>>   Based on (2), the files must behave exactly as-if there was one
> >> >> >>>   external *definition* for "x" in each.
> >> >> >>>
> >> >> >>> - Argument (3) explains why "x" has external *linkage*.
> >> >> >>>
> >> >> >>> - Argument (4) applies to "x" because "x" has external linkage, and 
> >> >> >>> is
> >> >> >>>   used in a non-sizeof expression. And the requirement set forth in 
> >> >> >>> (4)
> >> >> >>>   is broken by the program because the program is required to behave
> >> >> >>>   exactly as if "x" had two external definitions.
> >> >> >>>
> >> >> >>> In practical terms:
> >> >> >>>
> >> >> >>> - If you compile the first version of the program (without any 
> >> >> >>> special
> >> >> >>>   options), it links together successfully:
> >> >> >>>
> >> >> >>>   $ gcc -std=c89 -pedantic -Wall -Wextra -o f f1.c f2.c
> >> >> >>>
> >> >> >>> - If you compile the second (equivalent) version of the program,
> >> >> >>>   linkage fails:
> >> >> >>>
> >> >> >>>   $ gcc -std=c89 -pedantic -Wall -Wextra -o f-b f1-b.c f2-b.c
> >> >> >>>
> >> >> >>>   /tmp/cc8Isbn8.o:(.bss+0x0): multiple definition of `x'
> >> >> >>>   /tmp/cciQUlDz.o:(.bss+0x0): first defined here
> >> >> >>>   collect2: error: ld returned 1 exit status
> >> >> >>>
> >> >> >>> - The gcc bug is that linking the first version *too* should fail,
> >> >> >>>   without any particular options.
> >> >> >>
> >> >> >> That's true, but it would break existing code that declares 
> >> >> >> variables in
> >> >> >> headers without "extern".
> >> >> >
> >> >> > I agree. After I posted the email I pondered what it would take to fix
> >> >> > this in gcc. It would be impossible. :)
> >> >> >
> >> >> >> That's why Visual Studio does the same.
> >> >> >
> >> >> > Looks plausible.
> >> >> >
> >> >> > Thanks!
> >> >> > Laszlo
> >> >> >
> >> >>
> >> >> Indeed. Liming is looking into that. I spotted very few issues with
> >> >> -fno-common, only two in CryptoPkg, so I think we should disallow
> >> >> common allocations going forward if we can, especially since the
> >> >> modularity of EDK2 makes it almost impossible to guarantee that it
> >> >> never leads to problems.
> >> >>
> >> >> Qin has already acked a fix for one of those issues, I will ping him
> >> >> for the other one. In the mean time, perhaps GCC users could double
> >> >> check whether there is any breakage? Laszlo, could you check your OVMF
> >> >> builds, please?
> >> >
> >> > I'm seeing a build error with MdeModulePkg and OvmfPkg. This is with
> >> > gcc 5.2 using the GCC49 toolchain.
> >> >
> >> > Both cases seem to be unitialized global variables declared in a
> >> > single .c file. I'm not sure what needs to be changed to fix this.
> >> >
> >> > MdeModulePkg:
> >> >
> >> > "ld" -o 
> >> > Build/MdeModule/DEBUG_GCC49/X64/MdeModulePkg/Application/MemoryProfileInfo/MemoryProfileInfo/DEBUG/MemoryProfileInfo.dll
> >> >  -nostdlib -n -q --gc-sections -z common-page-size=0x40 --entry 
> >> > _ModuleEntryPoint -u _ModuleEntryPoint -Map 
> >> > Build/MdeModule/DEBUG_GCC49/X64/MdeModulePkg/Application/MemoryProfileInfo/MemoryProfileInfo/DEBUG/MemoryProfileInfo.map
> >> >  -melf_x86_64 --oformat=elf64-x86-64 --start-group  
> >> > @Build/MdeModule/DEBUG_GCC49/X64/MdeModulePkg/Application/MemoryProfileInfo/MemoryProfileInfo/OUTPUT/static_library_files.lst
> >> >  --end-group --defsym=PECOFF_HEADER_SIZE=0x228 
> >> > --script=BaseTools/Scripts/GccBase.lds
> >> > `mNameString' referenced in section `.text.GetDriverNameString' of 
> >> > Build/MdeModule/DEBUG_GCC49/X64/MdeModulePkg/Application/MemoryProfileInfo/MemoryProfileInfo/OUTPUT/MemoryProfileInfo.lib(MemoryProfileInfo.obj):
> >> >  defined in discarded section `COMMON' of 
> >> > Build/MdeModule/DEBUG_GCC49/X64/MdeModulePkg/Application/MemoryProfileInfo/MemoryProfileInfo/OUTPUT/MemoryProfileInfo.lib(MemoryProfileInfo.obj)
> >> > `mNameString' referenced in section `.text.GetDriverNameString' of 
> >> > Build/MdeModule/DEBUG_GCC49/X64/MdeModulePkg/Application/MemoryProfileInfo/MemoryProfileInfo/OUTPUT/MemoryProfileInfo.lib(MemoryProfileInfo.obj):
> >> >  defined in discarded section `COMMON' of 
> >> > Build/MdeModule/DEBUG_GCC49/X64/MdeModulePkg/Application/MemoryProfileInfo/MemoryProfileInfo/OUTPUT/MemoryProfileInfo.lib(MemoryProfileInfo.obj)
> >> > `mNameString' referenced in section `.text.GetDriverNameString' of 
> >> > Build/MdeModule/DEBUG_GCC49/X64/MdeModulePkg/Application/MemoryProfileInfo/MemoryProfileInfo/OUTPUT/MemoryProfileInfo.lib(MemoryProfileInfo.obj):
> >> >  defined in discarded section `COMMON' of 
> >> > Build/MdeModule/DEBUG_GCC49/X64/MdeModulePkg/Application/MemoryProfileInfo/MemoryProfileInfo/OUTPUT/MemoryProfileInfo.lib(MemoryProfileInfo.obj)
> >> > `mNameString' referenced in section `.text.GetDriverNameString' of 
> >> > Build/MdeModule/DEBUG_GCC49/X64/MdeModulePkg/Application/MemoryProfileInfo/MemoryProfileInfo/OUTPUT/MemoryProfileInfo.lib(MemoryProfileInfo.obj):
> >> >  defined in discarded section `COMMON' of 
> >> > Build/MdeModule/DEBUG_GCC49/X64/MdeModulePkg/Application/MemoryProfileInfo/MemoryProfileInfo/OUTPUT/MemoryProfileInfo.lib(MemoryProfileInfo.obj)
> >> > `mNameString' referenced in section `.text.DumpMemoryProfileDriverInfo' 
> >> > of 
> >> > Build/MdeModule/DEBUG_GCC49/X64/MdeModulePkg/Application/MemoryProfileInfo/MemoryProfileInfo/OUTPUT/MemoryProfileInfo.lib(MemoryProfileInfo.obj):
> >> >  defined in discarded section `COMMON' of 
> >> > Build/MdeModule/DEBUG_GCC49/X64/MdeModulePkg/Application/MemoryProfileInfo/MemoryProfileInfo/OUTPUT/MemoryProfileInfo.lib(MemoryProfileInfo.obj)
> >> > make: *** 
> >> > [Build/MdeModule/DEBUG_GCC49/X64/MdeModulePkg/Application/MemoryProfileInfo/MemoryProfileInfo/DEBUG/MemoryProfileInfo.dll]
> >> >  Error 1
> >> >
> >> > OvmfPkg:
> >> >
> >> > "ld" -o 
> >> > Build/OvmfX64/DEBUG_GCC49/X64/IntelFrameworkModulePkg/Universal/StatusCode/Pei/StatusCodePei/DEBUG/StatusCodePei.dll
> >> >  -nostdlib -n -q --gc-sections -z common-page-size=0x40 --entry 
> >> > _ModuleEntryPoint -u _ModuleEntryPoint -Map 
> >> > Build/OvmfX64/DEBUG_GCC49/X64/IntelFrameworkModulePkg/Universal/StatusCode/Pei/StatusCodePei/DEBUG/StatusCodePei.map
> >> >  -melf_x86_64 --oformat=elf64-x86-64 --start-group  
> >> > @Build/OvmfX64/DEBUG_GCC49/X64/IntelFrameworkModulePkg/Universal/StatusCode/Pei/StatusCodePei/OUTPUT/static_library_files.lst
> >> >  --end-group --defsym=PECOFF_HEADER_SIZE=0x228 
> >> > --script=BaseTools/Scripts/GccBase.lds
> >> > `gNullVaList' referenced in section `.text.AsciiBSPrint' of 
> >> > Build/OvmfX64/DEBUG_GCC49/X64/MdePkg/Library/BasePrintLib/BasePrintLib/OUTPUT/BasePrintLib.lib(PrintLib.obj):
> >> >  defined in discarded section `COMMON' of 
> >> > Build/OvmfX64/DEBUG_GCC49/X64/MdePkg/Library/BasePrintLib/BasePrintLib/OUTPUT/BasePrintLib.lib(PrintLib.obj)
> >> > GNUmakefile:406: recipe for target 
> >> > 'Build/OvmfX64/DEBUG_GCC49/X64/IntelFrameworkModulePkg/Universal/StatusCode/Pei/StatusCodePei/DEBUG/StatusCodePei.dll'
> >> >  failed
> >> > make: *** 
> >> > [Build/OvmfX64/DEBUG_GCC49/X64/IntelFrameworkModulePkg/Universal/StatusCode/Pei/StatusCodePei/DEBUG/StatusCodePei.dll]
> >> >  Error 1
> >> >
> >>
> >> Is this a clean rebuild?
> >
> > Yes, it was.
> >
> 
> And did you regenerate your Conf/tools_def.txt as well?

Yes-ish. I symlink the templates from BaseTools/Conf to Conf.

> I cannot reproduce the behavior where COMMON sections are created by
> GCC in the presence of -fno-common.

The issue appears to be that GCC44_ALL_CC_FLAGS needs to also be
modified. OVMF seems reasonably happy with the flag on GCC49.

I found this by searching for '-include AutoGen.h'. Maybe there are
some other cases we should cover?

-Jordan
_______________________________________________
edk2-devel mailing list
[email protected]
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to