<html><head><meta http-equiv="Content-Type" content="text/html charset=us-ascii"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><br class=""><div><blockquote type="cite" class=""><div class="">On Feb 16, 2017, at 3:51 AM, Ramana via lldb-dev <<a href="mailto:lldb-dev@lists.llvm.org" class="">lldb-dev@lists.llvm.org</a>> wrote:</div><br class="Apple-interchange-newline"><div class=""><div class="">It looks like LLDB doesn't like ELF relocatable files for debugging<br class="">and asserts with the following message when tried<br class=""><br class="">     <path to>/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp:2228:<br class="">unsigned int ObjectFileELF::RelocateSection(.....):  Assertion `false<br class="">&& "unexpected relocation type"' failed.<br class=""><br class="">Are we not supposed to debug ELF relocatable files on LLDB or am I<br class="">missing something?<br class=""><br class="">If we cannot debug the relocatable files, is it _simply_ because those<br class="">files lack program headers (program memory map) and relocations are<br class="">yet to be processed (for debug info) or there are other reasons?<br class=""><br class="">For our target, the assembler output itself is a self contained ELF<br class="">and hence will not have external references (both code and data). I am<br class="">wondering if I can debug these ELF files on LLDB with minimal changes<br class="">which does not require a full (or proper) linking step and would<br class="">appreciate any pointers on that.<br class=""><br class="">Thanks,<br class="">Ramana<br class=""></div></div></blockquote><br class=""></div><div>Looks like you just need to add support for the 32 bit relocations:</div><div><br class=""></div><div><br class=""></div><div><div style="margin: 0px; font-size: 11px; line-height: normal;" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">    </span><span style="font-variant-ligatures: no-common-ligatures; color: #ba2da2" class="">if</span><span style="font-variant-ligatures: no-common-ligatures" class=""> (hdr-></span><span style="font-variant-ligatures: no-common-ligatures; color: #31595d" class="">Is32Bit</span><span style="font-variant-ligatures: no-common-ligatures" class="">()) {</span></div><div style="margin: 0px; font-size: 11px; line-height: normal;" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">      </span><span style="font-variant-ligatures: no-common-ligatures; color: #ba2da2" class="">switch</span><span style="font-variant-ligatures: no-common-ligatures" class=""> (reloc_type(rel)) {</span></div><div style="margin: 0px; font-size: 11px; line-height: normal;" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">      </span><span style="font-variant-ligatures: no-common-ligatures; color: #ba2da2" class="">case</span><span style="font-variant-ligatures: no-common-ligatures" class=""> R_386_32:</span></div><div style="margin: 0px; font-size: 11px; line-height: normal;" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">      </span><span style="font-variant-ligatures: no-common-ligatures; color: #ba2da2" class="">case</span><span style="font-variant-ligatures: no-common-ligatures" class=""> R_386_PC32:</span></div><div style="margin: 0px; font-size: 11px; line-height: normal;" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">      </span><span style="font-variant-ligatures: no-common-ligatures; color: #ba2da2" class="">default</span><span style="font-variant-ligatures: no-common-ligatures" class="">:</span></div><div style="margin: 0px; font-size: 11px; line-height: normal; color: rgb(209, 47, 27);" class=""><span style="font-variant-ligatures: no-common-ligatures; color: #000000" class="">        </span><span style="font-variant-ligatures: no-common-ligatures; color: #78492a" class="">assert</span><span style="font-variant-ligatures: no-common-ligatures; color: #000000" class="">(</span><span style="font-variant-ligatures: no-common-ligatures; color: #ba2da2" class="">false</span><span style="font-variant-ligatures: no-common-ligatures; color: #000000" class=""> && </span><span style="font-variant-ligatures: no-common-ligatures" class="">"unexpected relocation type"</span><span style="font-variant-ligatures: no-common-ligatures; color: #000000" class="">);</span></div><div style="margin: 0px; font-size: 11px; line-height: normal;" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">      }</span></div><div style="margin: 0px; font-size: 11px; line-height: normal;" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">    } </span><span style="font-variant-ligatures: no-common-ligatures; color: #ba2da2" class="">else</span><span style="font-variant-ligatures: no-common-ligatures" class=""> {</span></div><div style="margin: 0px; font-size: 11px; line-height: normal;" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">      </span><span style="font-variant-ligatures: no-common-ligatures; color: #ba2da2" class="">switch</span><span style="font-variant-ligatures: no-common-ligatures" class=""> (reloc_type(rel)) {</span></div><div style="margin: 0px; font-size: 11px; line-height: normal;" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">      </span><span style="font-variant-ligatures: no-common-ligatures; color: #ba2da2" class="">case</span><span style="font-variant-ligatures: no-common-ligatures" class=""> R_X86_64_64: {</span></div><div style="margin: 0px; font-size: 11px; line-height: normal;" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">        symbol = symtab->FindSymbolByID(reloc_symbol(rel));</span></div><div style="margin: 0px; font-size: 11px; line-height: normal;" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">        </span><span style="font-variant-ligatures: no-common-ligatures; color: #ba2da2" class="">if</span><span style="font-variant-ligatures: no-common-ligatures" class=""> (symbol) {</span></div><div style="margin: 0px; font-size: 11px; line-height: normal;" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">          addr_t value = symbol->GetAddressRef().GetFileAddress();</span></div><div style="margin: 0px; font-size: 11px; line-height: normal;" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">          DataBufferSP &data_buffer_sp = debug_data.GetSharedDataBuffer();</span></div><div style="margin: 0px; font-size: 11px; line-height: normal;" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">          uint64_t *dst = </span><span style="font-variant-ligatures: no-common-ligatures; color: #ba2da2" class="">reinterpret_cast</span><span style="font-variant-ligatures: no-common-ligatures" class=""><uint64_t *>(</span></div><div style="margin: 0px; font-size: 11px; line-height: normal;" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">              data_buffer_sp->GetBytes() + rel_section->GetFileOffset() +</span></div><div style="margin: 0px; font-size: 11px; line-height: normal;" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">              ELFRelocation::RelocOffset64(rel));</span></div><div style="margin: 0px; font-size: 11px; line-height: normal;" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">          *dst = value + ELFRelocation::RelocAddend64(rel);</span></div><div style="margin: 0px; font-size: 11px; line-height: normal;" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">        }</span></div><div style="margin: 0px; font-size: 11px; line-height: normal;" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">        </span><span style="font-variant-ligatures: no-common-ligatures; color: #ba2da2" class="">break</span><span style="font-variant-ligatures: no-common-ligatures" class="">;</span></div><div style="margin: 0px; font-size: 11px; line-height: normal;" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">      }</span></div><div style="margin: 0px; font-size: 11px; line-height: normal;" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">      </span><span style="font-variant-ligatures: no-common-ligatures; color: #ba2da2" class="">case</span><span style="font-variant-ligatures: no-common-ligatures" class=""> R_X86_64_32:</span></div><div style="margin: 0px; font-size: 11px; line-height: normal;" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">      </span><span style="font-variant-ligatures: no-common-ligatures; color: #ba2da2" class="">case</span><span style="font-variant-ligatures: no-common-ligatures" class=""> R_X86_64_32S: {</span></div><div style="margin: 0px; font-size: 11px; line-height: normal;" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">        symbol = symtab->FindSymbolByID(reloc_symbol(rel));</span></div><div style="margin: 0px; font-size: 11px; line-height: normal;" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">        </span><span style="font-variant-ligatures: no-common-ligatures; color: #ba2da2" class="">if</span><span style="font-variant-ligatures: no-common-ligatures" class=""> (symbol) {</span></div><div style="margin: 0px; font-size: 11px; line-height: normal;" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">          addr_t value = symbol->GetAddressRef().GetFileAddress();</span></div><div style="margin: 0px; font-size: 11px; line-height: normal;" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">          value += ELFRelocation::RelocAddend32(rel);</span></div><div style="margin: 0px; font-size: 11px; line-height: normal;" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">          </span><span style="font-variant-ligatures: no-common-ligatures; color: #78492a" class="">assert</span><span style="font-variant-ligatures: no-common-ligatures" class="">(</span></div><div style="margin: 0px; font-size: 11px; line-height: normal;" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">              (reloc_type(rel) == R_X86_64_32 && (value <= </span><span style="font-variant-ligatures: no-common-ligatures; color: #78492a" class="">UINT32_MAX</span><span style="font-variant-ligatures: no-common-ligatures" class="">)) ||</span></div><div style="margin: 0px; font-size: 11px; line-height: normal;" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">              (reloc_type(rel) == R_X86_64_32S &&</span></div><div style="margin: 0px; font-size: 11px; line-height: normal;" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">               ((int64_t)value <= </span><span style="font-variant-ligatures: no-common-ligatures; color: #78492a" class="">INT32_MAX</span><span style="font-variant-ligatures: no-common-ligatures" class=""> && (int64_t)value >= </span><span style="font-variant-ligatures: no-common-ligatures; color: #78492a" class="">INT32_MIN</span><span style="font-variant-ligatures: no-common-ligatures" class="">)));</span></div><div style="margin: 0px; font-size: 11px; line-height: normal;" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">          uint32_t truncated_addr = (value & </span><span style="font-variant-ligatures: no-common-ligatures; color: #272ad8" class="">0xFFFFFFFF</span><span style="font-variant-ligatures: no-common-ligatures" class="">);</span></div><div style="margin: 0px; font-size: 11px; line-height: normal;" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">          DataBufferSP &data_buffer_sp = debug_data.GetSharedDataBuffer();</span></div><div style="margin: 0px; font-size: 11px; line-height: normal;" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">          uint32_t *dst = </span><span style="font-variant-ligatures: no-common-ligatures; color: #ba2da2" class="">reinterpret_cast</span><span style="font-variant-ligatures: no-common-ligatures" class=""><uint32_t *>(</span></div><div style="margin: 0px; font-size: 11px; line-height: normal;" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">              data_buffer_sp->GetBytes() + rel_section->GetFileOffset() +</span></div><div style="margin: 0px; font-size: 11px; line-height: normal;" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">              ELFRelocation::RelocOffset32(rel));</span></div><div style="margin: 0px; font-size: 11px; line-height: normal;" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">          *dst = truncated_addr;</span></div><div style="margin: 0px; font-size: 11px; line-height: normal;" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">        }</span></div><div style="margin: 0px; font-size: 11px; line-height: normal;" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">        </span><span style="font-variant-ligatures: no-common-ligatures; color: #ba2da2" class="">break</span><span style="font-variant-ligatures: no-common-ligatures" class="">;</span></div><div style="margin: 0px; font-size: 11px; line-height: normal;" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">      }</span></div><div style="margin: 0px; font-size: 11px; line-height: normal;" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">      </span><span style="font-variant-ligatures: no-common-ligatures; color: #ba2da2" class="">case</span><span style="font-variant-ligatures: no-common-ligatures" class=""> R_X86_64_PC32:</span></div><div style="margin: 0px; font-size: 11px; line-height: normal;" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">      </span><span style="font-variant-ligatures: no-common-ligatures; color: #ba2da2" class="">default</span><span style="font-variant-ligatures: no-common-ligatures" class="">:</span></div><div style="margin: 0px; font-size: 11px; line-height: normal; color: rgb(209, 47, 27);" class=""><span style="font-variant-ligatures: no-common-ligatures; color: #000000" class="">        </span><span style="font-variant-ligatures: no-common-ligatures; color: #78492a" class="">assert</span><span style="font-variant-ligatures: no-common-ligatures; color: #000000" class="">(</span><span style="font-variant-ligatures: no-common-ligatures; color: #ba2da2" class="">false</span><span style="font-variant-ligatures: no-common-ligatures; color: #000000" class=""> && </span><span style="font-variant-ligatures: no-common-ligatures" class="">"unexpected relocation type"</span><span style="font-variant-ligatures: no-common-ligatures; color: #000000" class="">);</span></div><div style="margin: 0px; font-size: 11px; line-height: normal;" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">      }</span></div><div style="margin: 0px; font-size: 11px; line-height: normal;" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">    }</span></div><div class=""><span style="font-variant-ligatures: no-common-ligatures" class=""><br class=""></span></div><div class=""><span style="font-variant-ligatures: no-common-ligatures" class=""><br class=""></span></div><div class="">I am guessing you will do something similar to the x86-64 stuff.</div><div class=""><br class=""></div><div class=""><br class=""></div></div><br class=""></body></html>