<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="Generator" content="Microsoft Exchange Server">
<!-- converted from rtf -->
<style><!-- .EmailQuote { margin-left: 1pt; padding-left: 4pt; border-left: #800000 2px solid; } --></style>
</head>
<body>
<font face="Calibri" size="2"><span style="font-size:11pt;">
<div>Hi Hans,</div>
<div>Thank you very much for your support.</div>
<div>It should not be a clang problem.</div>
<div><font face="Times New Roman"> </font></div>
<div>It is a problem that variable string (date and build host) is injected into ELF.</div>
<div>In zile/src/help.c:</div>
<div style="padding-left:36pt;"><i>DEFUN ("zile-version", zile_version)</i></div>
<div style="padding-left:36pt;"><i>/*+</i></div>
<div style="padding-left:36pt;"><i>Show the zile version.</i></div>
<div style="padding-left:36pt;"><i>+*/</i></div>
<div style="padding-left:36pt;"><i>{</i></div>
<div style="padding-left:36pt;"><i>  minibuf_write ("Zile " VERSION " of " CONFIGURE_DATE " on " CONFIGURE_HOST);</i></div>
<div style="padding-left:36pt;"> </div>
<div style="padding-left:36pt;"><i>  return TRUE;</i></div>
<div style="padding-left:36pt;"><i>}</i></div>
<div style="padding-left:36pt;"><i>END_DEFUN</i></div>
<div><font face="Times New Roman"> </font></div>
<div>This result in .rodata diffs between two build:</div>
<div style="padding-left:36pt;"><i>***************</i></div>
<div style="padding-left:36pt;"><i>*** 1 ****</i></div>
<div style="padding-left:36pt;"><i>!   [  1d1a]  Zile 2.2.59 of Wed Nov 01 2017 on </i><i>host</i><i>-10</i></div>
<div style="padding-left:36pt;"><i>--- 1 ----</i></div>
<div style="padding-left:36pt;"><i>!   [  1d1a]  Zile 2.2.59 of Wed Jul 04 2018 on </i><i>host</i><i>-04</i></div>
<div><font face="Times New Roman"> </font></div>
<div>"4" is a constant string defined in source code:</div>
<div>In zile/src/variables.c: </div>
<div style="padding-left:36pt;"><i>/*</i></div>
<div style="padding-left:36pt;"><i>* Default variables values table.</i></div>
<div style="padding-left:36pt;"><i>*/</i></div>
<div style="padding-left:36pt;"><i>static struct var_entry</i></div>
<div style="padding-left:36pt;"><i>{</i></div>
<div style="padding-left:36pt;"><i> char \*var;            /* Variable name. */</i></div>
<div style="padding-left:36pt;"><i> char \*val;            /* Default value. */</i></div>
<div style="padding-left:36pt;"><i> int local;            /* If true, becomes local when set. */</i></div>
<div style="padding-left:36pt;"><i>} def_vars[] =</i></div>
<div style="padding-left:36pt;"><i>{</i></div>
<div style="padding-left:36pt;"><i>#define X(var, val, local, doc) { var, val, local },</i></div>
<div style="padding-left:36pt;"><i>#include "tbl_vars.h"</i></div>
<div style="padding-left:36pt;"><i>#undef X</i></div>
<div style="padding-left:36pt;"><i>};</i></div>
<div>In zile/src/tbl_vars.h:</div>
<div style="padding-left:36pt;"><i>X ("standard-indent", "4", FALSE, "\</i></div>
<div><font face="Times New Roman"> </font></div>
<div>"4" point at the end of " \F4" in one build, and point at the end of "Zile 2.2.59 of Wed Jul 04 2018 on host-04" in another build, thus after linking cause ELF .data section diffs.</div>
<div><font face="Times New Roman"> </font></div>
<div>-----Original Message-----<br>

From: hwennborg@google.com [<a href="mailto:hwennborg@google.com">mailto:hwennborg@google.com</a>] On Behalf Of Hans Wennborg<br>

Sent: Friday, July 6, 2018 5:01 PM<br>

To: Jian, Xu<br>

Cc: cfe-users@lists.llvm.org<br>

Subject: Re: [cfe-users] how clang merge strings in .rodata section</div>
<div><font face="Times New Roman"> </font></div>
<div>On Fri, Jul 6, 2018 at 10:22 AM, Jian, Xu <<a href="mailto:Xu.Jian@dell.com">Xu.Jian@dell.com</a>> wrote:</div>
<div>> Hi Hans,</div>
<div>> We need to compare whether ELF files of two builds are identical.</div>
<div>> Because of string merge, the comparison has some trouble.</div>
<div>></div>
<div>> For example in case following code lines (may be in different files):</div>
<div>> ---------------------------------------------------------------</div>
<div>> const char* s_array[1]="s";</div>
<div>> const char *first_s="this first bigger s"; const char *second_s="this </div>
<div>> second bigger s";</div>
<div>> ---------------------------------------------------------------</div>
<div>></div>
<div>> After clang build ELF out, sometimes the s_array[1] contail the position of the tail of first_s in .rodata second, while sometimes second_s.</div>
<div>> This lead to .data section diff since s_array is in it.</div>
<div>> The ELF diffs, while nothing changed from functionality point of view.</div>
<div> </div>
<div>Did the inputs change? If Clang is sometimes using the tail of first_s and sometimes second_s, for the same input, that's a bug. The compilation should be deterministic.</div>
<div> </div>
<div>Can you provide sample input files and command lines that show this problem?</div>
<div> </div>
<div>Thanks,</div>
<div>Hans</div>
<div> </div>
<div> </div>
<div>> -----Original Message-----</div>
<div>> From: <a href="mailto:hwennborg@google.com">hwennborg@google.com</a> [<a href="mailto:hwennborg@google.com">mailto:hwennborg@google.com</a>] On Behalf Of </div>
<div>> Hans Wennborg</div>
<div>> Sent: Friday, July 6, 2018 3:54 PM</div>
<div>> To: Jian, Xu</div>
<div>> Cc: <a href="mailto:cfe-users@lists.llvm.org">cfe-users@lists.llvm.org</a></div>
<div>> Subject: Re: [cfe-users] how clang merge strings in .rodata section</div>
<div>></div>
<div>> On Thu, Jul 5, 2018 at 3:18 AM, Jian, Xu via cfe-users <<a href="mailto:cfe-users@lists.llvm.org">cfe-users@lists.llvm.org</a>> wrote:</div>
<div>>> Hi,</div>
<div>>></div>
<div>>> The following c source code abc.c:</div>
<div>>></div>
<div>>> #include <stdio.h></div>
<div>>></div>
<div>>> int g_val=10;</div>
<div>>></div>
<div>>> const char *g_str="abc";</div>
<div>>></div>
<div>>> const char *g_str1="c";</div>
<div>>></div>
<div>>> int main(void)</div>
<div>>></div>
<div>>> {</div>
<div>>></div>
<div>>>     printf("%s %s: %d\n",g_str,g_str1,g_val);</div>
<div>>></div>
<div>>>     return 0;</div>
<div>>></div>
<div>>> }</div>
<div>>></div>
<div>>></div>
<div>>></div>
<div>>> When compile with “clang abc.c -o abc” then dump .rodata section:</div>
<div>>></div>
<div>>> # readelf -p .rodata abc</div>
<div>>></div>
<div>>></div>
<div>>></div>
<div>>> String dump of section '.rodata':</div>
<div>>></div>
<div>>>   [     0]  abc</div>
<div>>></div>
<div>>>  [     4]  %s %s: %d</div>
<div>>></div>
<div>>></div>
<div>>></div>
<div>>> When compile with “gcc abc.c -o abc” then dump .rodata section:</div>
<div>>></div>
<div>>> $ readelf -p .rodata abc</div>
<div>>></div>
<div>>></div>
<div>>></div>
<div>>> String dump of section '.rodata':</div>
<div>>></div>
<div>>>   [    10]  abc</div>
<div>>></div>
<div>>>   [    14]  c</div>
<div>>></div>
<div>>>   [    16]  %s %s: %d^J</div>
<div>>></div>
<div>>></div>
<div>>></div>
<div>>> clang is able to merge short string (“c”) into the tail of a long </div>
<div>>> string (“abc”), while gcc will not.</div>
<div>>></div>
<div>>> Does anybody know how to disable this behavior (make it similar to gcc) ?</div>
<div>></div>
<div>> I don't think there is a way to disable it.</div>
<div>></div>
<div>> Why do you want to disable this behaviour?</div>
<div>></div>
<div>>  - Hans</div>
<div><font face="Times New Roman"> </font></div>
</span></font>
</body>
</html>