<div dir="ltr"><div>I've not looked at the GNU behaviour, but the purpose of -fdata-sections in my experience is to provide the ability to do section-level operations like --gc-sections, --icf, symbol ordering etc. SHF_MERGE sections, such as .rodata string and integer literal sections, are internally fragmentable by the linker using rules defined by the ABI, so a linker can already easily strip them without -fdata-sections splitting them up. LLD does this, and I don't see why other linkers couldn't either (obviously this might require the functionality to be implemented properly in those linkers).<br></div><div><br></div><div>Input section overhead is a big deal, based on experiments I've recently been doing, both because of the additional incurred I/O and the time it takes in the linker to process the additional sections. If an object has many literals, this will drastically bloat the input size, which imposes a cost on people who want to be able to do proper --gc-sections [--icf etc] who use LLD, for no gain.<br></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Thu, 17 Sep 2020 at 09:38, Gaël Jobin via llvm-dev <<a href="mailto:llvm-dev@lists.llvm.org">llvm-dev@lists.llvm.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div style="font-size:10pt;font-family:Verdana,Geneva,sans-serif">
<p id="gmail-m_-4430315776283295046reply-intro">On 2020-09-16 19:42, Fangrui Song wrote:</p>
<blockquote type="cite" style="padding:0px 0.4em;border-left:2px solid rgb(16,16,255);margin:0px">
<div style="margin:0px;padding:0px;font-family:monospace"><span style="white-space:nowrap">On 2020-09-16, Gaël Jobin wrote:</span></div>
<div style="margin:0px;padding:0px;font-family:monospace"><br><span style="white-space:nowrap">Your example uses global mutable variables "test" and "unused" and that</span><br><span style="white-space:nowrap">is why they are in the .data.* sections. They are initialized to</span><br><span style="white-space:nowrap">addresses of string literals in .rodata.* . .rodata.* are what we care</span><br><span style="white-space:nowrap">about, not .data.* (.data.* can always be correctly garbage collected by</span><br><span style="white-space:nowrap">GNU ld/gold/LLD).</span></div>
</blockquote>
<div style="margin:0px;padding:0px;font-family:monospace"> </div>
<div style="margin:0px;padding:0px;font-family:monospace"><span style="white-space:nowrap;font-family:verdana,geneva,sans-serif">Of course, the issue here is .rodata.*. I use the .data.* section as a counterexample</span></div>
<div style="margin:0px;padding:0px;font-family:monospace"><span style="white-space:nowrap;font-family:verdana,geneva,sans-serif"><span style="white-space:nowrap;font-family:verdana,geneva,sans-serif">but it could be any section.  </span></span><span style="font-family:verdana,geneva,sans-serif;white-space:nowrap;font-size:10pt">I compare </span><span style="white-space:nowrap;font-family:verdana,geneva,sans-serif">those two sections because they contain both</span></div>
<div style="margin:0px;padding:0px;font-family:monospace"><span style="white-space:nowrap;font-family:verdana,geneva,sans-serif"> small datas and the ratio "section header </span><span style="font-family:verdana,geneva,sans-serif;white-space:nowrap;font-size:10pt">size" vs "data size" is not optimal.</span></div>
<div style="margin:0px;padding:0px;font-family:monospace"> </div>
<div style="margin:0px;padding:0px;font-family:monospace"><span style="white-space:nowrap;font-family:verdana,geneva,sans-serif">But my point is: Why the implementation of </span><span style="font-family:verdana,geneva,sans-serif;white-space:nowrap;font-size:10pt">-fdata-sections should differ between .data.*</span></div>
<div style="margin:0px;padding:0px;font-family:monospace"><span style="font-family:verdana,geneva,sans-serif;white-space:nowrap;font-size:10pt">and .rodata.* sections? Or why .rodata.* should be treated differently?</span></div>
<div style="margin:0px;padding:0px;font-family:monospace"> </div>
<div style="margin:0px;padding:0px;font-family:monospace"><span style="white-space:nowrap;font-family:verdana,geneva,sans-serif">If the only </span><span style="white-space:nowrap;font-family:verdana,geneva,sans-serif">reason is because it is suboptimal due to the additional section header,</span></div>
<div style="margin:0px;padding:0px;font-family:monospace"><span style="white-space:nowrap;font-family:verdana,geneva,sans-serif">this is definitely not a valid reason. Having everything in its own section is the</span></div>
<div style="margin:0px;padding:0px;font-family:monospace"><span style="white-space:nowrap;font-family:verdana,geneva,sans-serif">purpose of the -f*-sections and allows the linker to easily strip them. I really</span></div>
<div style="margin:0px;padding:0px;font-family:monospace"><span style="white-space:nowrap;font-family:verdana,geneva,sans-serif">don't get the exception made for .rodata.* here.</span></div>
<blockquote type="cite" style="padding:0px 0.4em;border-left:2px solid rgb(16,16,255);margin:0px">
<div style="margin:0px;padding:0px;font-family:monospace"> </div>
</blockquote>

</div>
_______________________________________________<br>
LLVM Developers mailing list<br>
<a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a><br>
<a href="https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev" rel="noreferrer" target="_blank">https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev</a><br>
</blockquote></div>