<div dir="ltr">Are you suggesting I bring it up to the LLVM blog? This comment is my opinion, and I guess not everybody agrees we should avoid exporting globals from DSOs.<div class="gmail_extra"><br><div class="gmail_quote">On Mon, Feb 20, 2017 at 7:49 AM, Hal Finkel <span dir="ltr"><<a href="mailto:hfinkel@anl.gov" target="_blank">hfinkel@anl.gov</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hi Rui,<br>
<br>
I certainly found this informative, thanks for writing this. I think this would also be a good topic for a blog post; those will get a larger audience.<br>
<br>
 -Hal<div class="m_-7238474665183767036HOEnZb"><div class="m_-7238474665183767036h5"><br>
<br>
<br>
On 02/19/2017 08:22 PM, Rui Ueyama via llvm-commits wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Author: ruiu<br>
Date: Sun Feb 19 20:22:56 2017<br>
New Revision: 295632<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=295632&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject?rev=295632&view=rev</a><br>
Log:<br>
Add more comments about copy relocations.<br>
<br>
Modified:<br>
     lld/trunk/ELF/Relocations.cpp<br>
<br>
Modified: lld/trunk/ELF/Relocations.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Relocations.cpp?rev=295632&r1=295631&r2=295632&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/lld/trunk/ELF/Relocation<wbr>s.cpp?rev=295632&r1=295631&r2=<wbr>295632&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- lld/trunk/ELF/Relocations.cpp (original)<br>
+++ lld/trunk/ELF/Relocations.cpp Sun Feb 19 20:22:56 2017<br>
@@ -461,6 +461,21 @@ static std::vector<SharedSymbol<ELFT> *><br>
  // dynamic linker, and the relocation contains not only symbol name but<br>
  // various other informtion about the symbol. So, such attributes become a<br>
  // part of the ABI.<br>
+//<br>
+// Note for application developers: I can give you a piece of advice if<br>
+// you are writing a shared library. You probably should export only<br>
+// functions from your library. You shouldn't export variables.<br>
+//<br>
+// As an example what can happen when you export variables without knowing<br>
+// the semantics of copy relocations, assume that you have an exported<br>
+// variable of type T. It is an ABI-breaking change to add new members at<br>
+// end of T even though doing that doesn't change the layout of the<br>
+// existing members. That's because the space for the new members are not<br>
+// reserved in .bss unless you recompile the main program. That means they<br>
+// are likely to overlap with other data that happens to be laid out next<br>
+// to the variable in .bss. This kind of issue is sometimes very hard to<br>
+// debug. What's a solution? Instead of exporting a varaible V from a DSO,<br>
+// define an accessor getV().<br>
  template <class ELFT> static void addCopyRelSymbol(SharedSymbol<<wbr>ELFT> *SS) {<br>
    typedef typename ELFT::uint uintX_t;<br>
  @@ -482,10 +497,10 @@ template <class ELFT> static void addCop<br>
    // Look through the DSO's dynamic symbol table for aliases and create a<br>
    // dynamic symbol for each one. This causes the copy relocation to correctly<br>
    // interpose any aliases.<br>
-  for (SharedSymbol<ELFT> *Alias : getSymbolsAt(SS)) {<br>
-    Alias->NeedsCopy = true;<br>
-    Alias->Section = ISec;<br>
-    Alias->symbol()->IsUsedInRegul<wbr>arObj = true;<br>
+  for (SharedSymbol<ELFT> *Sym : getSymbolsAt(SS)) {<br>
+    Sym->NeedsCopy = true;<br>
+    Sym->Section = ISec;<br>
+    Sym->symbol()->IsUsedInRegular<wbr>Obj = true;<br>
    }<br>
      In<ELFT>::RelaDyn->addReloc({T<wbr>arget->CopyRel, ISec, 0, false, SS, 0});<br>
<br>
<br>
______________________________<wbr>_________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/<wbr>mailman/listinfo/llvm-commits</a><br>
</blockquote>
<br></div></div><span class="m_-7238474665183767036HOEnZb"><font color="#888888">
-- <br>
Hal Finkel<br>
Lead, Compiler Technology and Programming Languages<br>
Leadership Computing Facility<br>
Argonne National Laboratory<br>
<br>
</font></span></blockquote></div><br></div></div>