Shi, Steven via llvm-dev
2019-Jul-05 13:12 UTC
[llvm-dev] lld-link fails to link uefi binary because of undefined symbol _fltused
Hi Rui, Peter,
We meet a problem to use lld-link to generate uefi binary. It is related to the
lld-link force to use float point lib symbol: _fltused. Uefi binary doesn't
use any external float point lib and we don't know how to tell lld-link not
to emit the float point lib symbol. Below is a simplified example to reproduce
this issue. Please give me some advice. Thanks!
$ cat main.c
double v=0;
void mainfunction(){
v+=1;
}
$ ~/llvm-project/releaseinstall/bin/clang -c -Oz -flto -target
x86_64-unknown-windows main.c -o main.ir
$ ~/llvm-project/releaseinstall/bin/lld-link /machine:X64 /DLL
/ENTRY:mainfunction main.ir /OUT:main.dll
lld-link: error: undefined symbol: _fltused>>> referenced by lto.tmp
Thanks
Steven
-------------- next part --------------
An HTML attachment was scrubbed...
URL:
<http://lists.llvm.org/pipermail/llvm-dev/attachments/20190705/7f4d9e35/attachment.html>
James Y Knight via llvm-dev
2019-Jul-05 13:35 UTC
[llvm-dev] lld-link fails to link uefi binary because of undefined symbol _fltused
This is expected behavior -- if you use floating point operations in a
source file, the _fltused symbol is mentioned in order to run the
floating-point-environment initialization routine from the MS CRT.
If you want to make a standalone binary, not linking against the CRT, you
can simply define "int _fltused = 0;" in some source file, within
extern
"C" {} if you're in C++. (Note that the definition of the symbol
doesn't
actually matter, since it's normally only used as a trigger to pull in the
initialization function.)
On Fri, Jul 5, 2019 at 9:13 AM Shi, Steven via llvm-dev <
llvm-dev at lists.llvm.org> wrote:
> Hi Rui, Peter,
>
> We meet a problem to use lld-link to generate uefi binary. It is related
> to the lld-link force to use float point lib symbol: _fltused. Uefi binary
> doesn’t use any external float point lib and we don’t know how to tell
> lld-link not to emit the float point lib symbol. Below is a simplified
> example to reproduce this issue. Please give me some advice. Thanks!
>
>
>
>
>
> $ cat main.c
>
> double v=0;
>
> void mainfunction(){
>
> v+=1;
>
> }
>
> $ ~/llvm-project/releaseinstall/bin/clang -c -Oz -flto -target
> x86_64-unknown-windows main.c -o main.ir
>
> $ ~/llvm-project/releaseinstall/bin/lld-link /machine:X64 /DLL
> /ENTRY:mainfunction main.ir /OUT:main.dll
>
> lld-link: error: undefined symbol: _fltused
>
> >>> referenced by lto.tmp
>
>
>
> Thanks
>
> Steven
> _______________________________________________
> LLVM Developers mailing list
> llvm-dev at lists.llvm.org
> https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL:
<http://lists.llvm.org/pipermail/llvm-dev/attachments/20190705/89af48e6/attachment.html>
Peter Smith via llvm-dev
2019-Jul-05 13:35 UTC
[llvm-dev] lld-link fails to link uefi binary because of undefined symbol _fltused
Hello Steven,
Apologies this is a little bit out of my area of expertise
(Windows/COFF). The reference to _fltused is coming from the compiler
and not the linker. You can see this by compiling your source file
without LTO and dumping the symbols. For example
bin/clang -c -Oz -target x86_64-unknown-windows main.c -o main.o
bin/llvm-readobj --symbols main.o
...
Symbol {
Name: _fltused
Value: 0
Section: IMAGE_SYM_UNDEFINED (0)
BaseType: Null (0x0)
ComplexType: Null (0x0)
StorageClass: External (0x2)
AuxSymbolCount: 0
}
...
In your case it will have come from the lld code generator.
A change to add this reference looks like
https://reviews.llvm.org/D56548 from various comments it seems like
this reference might be required by the Windows ABI in some cases. If
in your use case you don't need this then I suggest supplying a dummy
definition of the symbol in another object (making sure that LTO
doesn't remove it).
I think others on the list are more familiar with Windows.
Peter
On Fri, 5 Jul 2019 at 14:12, Shi, Steven <steven.shi at intel.com>
wrote:>
> Hi Rui, Peter,
>
> We meet a problem to use lld-link to generate uefi binary. It is related to
the lld-link force to use float point lib symbol: _fltused. Uefi binary doesn’t
use any external float point lib and we don’t know how to tell lld-link not to
emit the float point lib symbol. Below is a simplified example to reproduce this
issue. Please give me some advice. Thanks!
>
>
>
>
>
> $ cat main.c
>
> double v=0;
>
> void mainfunction(){
>
> v+=1;
>
> }
>
> $ ~/llvm-project/releaseinstall/bin/clang -c -Oz -flto -target
x86_64-unknown-windows main.c -o main.ir
>
> $ ~/llvm-project/releaseinstall/bin/lld-link /machine:X64 /DLL
/ENTRY:mainfunction main.ir /OUT:main.dll
>
> lld-link: error: undefined symbol: _fltused
>
> >>> referenced by lto.tmp
>
>
>
> Thanks
>
> Steven