[LLVMdev] [lld] ELF/Linux support

Shankar Easwaran shankare at codeaurora.org
Fri Sep 12 09:11:19 PDT 2014


Hi Oleg,

There may be multiple issues on handling weak symbols, I will try to fix 
this.

Shankar Easwaran

On 9/12/2014 4:35 AM, Oleg Ranevskyy wrote:
> Hello LLVM community,
>
> I am evaluating profitability of using the LLVM lld for linking our 
> projects.
>
> As a test, I tried to build the latest Boost with clang / lld on 
> X86_64 Ubuntu and faced a problem at the very first step of doing 
> this. One of the Boost's auxiliary tools refers to the "environ" 
> variable to access the environment variables. "environ" is defined in 
> glibc and is actually a weak alias for the "__environ" variable. Here 
> is a fragment of posix/environ.c:
>
> char **__environ = NULL; // var pointing to env vars array
> weak_alias (__environ, environ) // and two weak aliases to it
> weak_alias (__environ, _environ)
>
> When linking a program that accesses "environ" with binutils' ld, the 
> symbol is correctly marked as a weak object:
>   > nm a.out | grep environ
>      0000000000601040 B __environ@@GLIBC_2.2.5
>      0000000000601040 *V *environ@@GLIBC_2.2.5
>
> LLVM lld marks it as uninitialized data from the BSS section:
>      0000000000401168 *B* environ
>
> Readelf also shows different symbols (readelf -s a.out | grep environ):
>   - ld:
>      4: 0000000000601040     8 OBJECT  WEAK   DEFAULT   25 
> _environ at GLIBC_2.2.5 (2)
>      5: 0000000000601040     8 OBJECT  WEAK   DEFAULT   25 
> environ at GLIBC_2.2.5 (2)        <- environ is a weak object
>      6: 0000000000601040     8 OBJECT  GLOBAL DEFAULT   25 
> __environ at GLIBC_2.2.5 (2)   <- __environ itself is present as a global
>     54: 0000000000601040     8 OBJECT  WEAK   DEFAULT   25 
> environ@@GLIBC_2.2.5
>     63: 0000000000601040     8 OBJECT  GLOBAL DEFAULT   25 
> __environ@@GLIBC_2.2.5
>
>   - lld
>          1: 0000000000401168     8 OBJECT  GLOBAL DEFAULT   22 
> environ    <- no __environ reference. Environ is a global, not weak
>          8: 0000000000000000     8 OBJECT  GLOBAL DEFAULT  UND environ
>        37: 0000000000401168     8 OBJECT  GLOBAL DEFAULT   22 environ
>
> This leads to "environ" being nil when running the lld-linked binary.
>
> Is it a known problem?
> What is the fullness of ELF/Linux support?
> Where can I find the features list that are expected to work and what 
> work is still in progress?
>
> Thank you!
>
> Kind regards,
> Oleg
>
>
>
> _______________________________________________
> LLVM Developers mailing list
> LLVMdev at cs.uiuc.edu         http://llvm.cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev


-- 
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, hosted by the Linux Foundation

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20140912/44e2cff3/attachment.html>


More information about the llvm-dev mailing list