<div dir="ltr">Hi,<br><div class="gmail_extra"><br><div class="gmail_quote">2013/4/19 Chris Johns <span dir="ltr"><<a href="mailto:chrisj@rtems.org" target="_blank">chrisj@rtems.org</a>></span><br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
<div class="im">Peng Fan wrote:<br>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
<br>
    There are symbols in main.c that understand the tar file. Is<br>
    something wrong with them ?<br>
<br>
  I looked insight into the code and found that<br>
  the fs-root.tar is untared by setup_rootfs->Untar_<u></u>FromMemory.<br>
  Is it becasue the tar version on my host pc does not match Untar_* in<br>
RTEMS?<br>
  I follow the compilation log to clarify how waf works and how<br>
fs-root.tar is compiled into rtld.look at the following:<br>
1. shell-init libx.a -> fs-root.tar -> fs-root-tarfile.o<br>
</blockquote>
<br></div>
Yes using objcopy.<div class="im"><br>
<br>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
2. init.c.5.o main.c.5.o fs-root-tarfile.o -lrtl -> rtld.prelink<br>
</blockquote>
<br></div>
Link it together.<div class="im"><br>
<br>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
3. nm rtld.prelink -> rtld-gsyms.c<br>
</blockquote>
<br></div>
Get the symbols present in the base image.<div class="im"><br>
<br>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
4. init.c main.c rtld-gsyms.c xa.c x-long-name...-in-archive.c<br>
   -> x.rap<br>
</blockquote>
<br></div>
Create the RAP app.<div class="im"><br>
<br>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
5. shell-init libx.a x.rap -> fs-root.tar -> fs-root-tarfile.o<br>
</blockquote>
<br></div>
Build the tar file.<div class="im"><br>
<br>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
6. init.c.10.o main.c.10.o fs-root-tarfile.o  rtld-gsyms.10.o -lrtl -> rtld<br>
</blockquote>
<br></div>
Relink with the symbol table generated so the base image has its own symbol table.<div class="im"><br>
<br>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
I also objdump the code to see if any address is wrong, but all is ok.<br>
Now what I doubt is only verison mismatch.<br>
</blockquote>
<br></div>
Great.<div class="im"><br></div></blockquote><div style>Thanks for your encouragement. All is challenging and interesting.</div><div style><br></div><div style>I have resovled the "<span style="font-family:arial,sans-serif;font-size:14px">shell: open input /shell-init failed: No such file or directory</span>" problem. The version mismatch between my host(Opensuse with tar 1.26) and rtems Untar_*.  </div>
<div style><br></div><div style>The code in Untar_FromMemory use the first 512 block as the header.It is right indeed. But it does not judge the linkflag whether it is extened or others, and this incurs error. The GNU tar 1.26:<a href="http://www.gnu.org/software/tar/manual/html_node/Standard.html">http://www.gnu.org/software/tar/manual/html_node/Standard.html</a> gives the details  </div>
<div style>  </div><div style><span style="color:rgb(0,0,0);font-size:smaller">#define XHDTYPE  'x'            /*</span><span class="" style="color:rgb(0,0,0);font-family:serif"> Extended header referring to the </span><span class="" style="color:rgb(0,0,0);font-family:serif">next file in the archive </span><span style="color:rgb(0,0,0);font-size:smaller">*/</span></div>
<div style><pre class="" style="font-size:smaller;color:rgb(0,0,0)">#define XGLTYPE  'g'            /*<span class="" style="font-family:serif"> Global extended header </span>*/</pre><pre class="" style><font face="arial"><span style="white-space:normal">If linkflag is XHDTYPE, we should reconsider how to process the header,because</span></font></pre>
<pre class="" style><font face="arial"><span style="white-space:normal">'x' means an extened header after the first begin header in which file_size is not the size of the size but the extened header.</span></font></pre>
<pre class="" style><font face="arial"><span style="white-space:normal">I use a simple way, under the original header processing code, adding the following code :</span></font></pre><pre class="" style><font face="arial"><span style="white-space:normal"><br>
</span></font></pre><pre class="" style><font face="arial"><span style="white-space:normal"> ptr += 512; //jump to the real header containing the size info of the file in tarball.</span></font></pre><pre class="" style><font face="arial"><span style="white-space:normal"> if (linkflag == 'x') { //here is really a simple way, because there are many other flags.</span></font></pre>
<pre class="" style><font face="arial"><span style="white-space:normal"> bufr = &tar_ptr[ptr];</span></font></pre><pre class="" style><font face="arial"><span style="white-space:normal"> strncpy(fname, bufr, MAX_NAME_FIELD_SIZE);</span></font></pre>
<pre class="" style><font face="arial"><span style="white-space:normal"> fname[MAX_NAME_FIELD_SIZE] = '\0';</span></font></pre><pre class="" style><font face="arial"><span style="white-space:normal"> linkflag   = bufr[156];</span></font></pre>
<pre class="" style><font face="arial"><span style="white-space:normal"> file_size  = _rtems_octal2ulong(&bufr[124], 12); </span></font></pre><pre class="" style><font face="arial"><span style="white-space:normal"> ptr += 512;</span></font></pre>
<pre class="" style><font face="arial"><span style="white-space:normal"> hdr_chksum = _rtems_octal2ulong(&bufr[148], 8);</span></font></pre><pre class="" style><font face="arial"><span style="white-space:normal"> sum = _rtems_tar_header_checksum(bufr);</span></font></pre>
<pre class="" style><font face="arial"><span style="white-space:normal"> if (sum != hdr_chksum)
      { </span></font></pre><pre class="" style><font face="arial"><span style="white-space:normal"> retval = UNTAR_INVALID_CHECKSUM;</span></font></pre><pre class="" style><font face="arial"><span style="white-space:normal"> break; </span></font></pre>
<pre class="" style><font face="arial"><span style="white-space:normal"> } </span></font></pre><pre class="" style><font face="arial"><span style="white-space:normal"> }
<br></span></font></pre><pre class="" style><span style="font-family:arial;white-space:normal">I do not know whether this is a bug for RTEMS or not. </span><font face="arial"><span style="white-space:normal"><br></span></font></pre>
<pre class="" style><font face="arial"><span style="white-space:normal">Added the code, I can see the three files: libx.a shell-init  x.rap</span></font></pre><pre class="" style><font face="arial"><span style="white-space:normal">Here appears another problem:</span></font></pre>
<pre class="" style><font face="arial"><span style="white-space:normal">When "rap ld ./x.rap", it tells "error: loading: (0)</span></font><span style="white-space:normal;font-family:arial">"</span></pre>
<pre class="" style><font face="arial"><span style="white-space:normal">When "dlo x.rap", "error: duplicate global symbol: hello</span></font><span style="white-space:normal;font-family:arial">". However,</span><span style="font-family:arial;white-space:normal"> </span><font face="arial"><span style="white-space:normal">dlo libx.a:xa.c.1.o and dlo libx.a:x-long-name-to-create-gnu-extension-in-archive.c.1.o is ok.</span></font></pre>
<pre class="" style><font face="arial"><span style="white-space:normal"><br></span></font></pre></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
<div class="im">
<br>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
<br>
A question that I want your answer, is the rtld.prelink only used for<br>
generating rtld-gsymcs.c? I think it is, but not sure.<br>
<br>
</blockquote>
<br></div>
Yes. You need to perform a link so the needed symbols are pulled into the kernel. Once you have these symbols you can generate a symbol table and then relink. The original base image has a weak symbol which is overridden with the real symbol table.<br>

<br>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
<br>
When modified the rtems.py with "d.endswith('-rtems*eabi*' + version)",<br>
</blockquote>
<br>
The RTEMS tools are arm-rtems4.11. As far as I know there is no need for 'eabi' to be present in the tools any more.<div class="im"><br>
<br>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
It tells "error: libelf:elf_getdata: .ARM.attributes(xa.c.8.o): Invalid<br>
section descriptor"<br>
</blockquote>
<br></div>
This is the bug.<div class="im"><br>
<br>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
I may dig into rtl-host code to figure out why and this may be part of<br>
the work that I should focus on<br>
</blockquote>
<br></div>
Thanks. It will be in the ELF section parsing somewhere.<div class="im"><br>
<br>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
    The project need work to implement more architectures. I am<br>
    traveling at the moment and will be back later in the week. A<br>
    proposal to work on these other archs would be welcome.<br>
<br>
I want to implement arm support first. If time permits, I will implement<br>
mips too.<br>
Now I can not evaluate the workload whether I can finish one, two or<br>
more. I am preparing the proposal and it'll be finished soon.<br>
</blockquote>
<br></div>
Great.</blockquote><div>Thanks  </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><span class=""><font color="#888888"><br>

<br>
Chris<br>
</font></span></blockquote></div><br></div><div class="gmail_extra" style>Regards,</div><div class="gmail_extra" style>Peng.</div></div>