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? I'm surprised GCC is still emitting variables
into COMMON sections after setting -fno-common.
_______________________________________________
edk2-devel mailing list
[email protected]
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to