This is the mail archive of the elfutils-devel@sourceware.org mailing list for the elfutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH 2/3] libdwfl: Add minisymtab support.


On Tue, Jan 22, 2013 at 08:53:46PM +0100, Jan Kratochvil wrote:
> On Tue, 22 Jan 2013 19:19:04 +0100, Mark Wielaard wrote:
> > On Tue, Jan 22, 2013 at 06:28:03PM +0100, Jan Kratochvil wrote:
> > > This is OK as long as there cannot happen:
> > > 	mod->first_global == 0 && mod->aux_symdata != NULL
> > > 	and therefore also:       mod->aux_first_global > 0
> > 
> > If that happens then first_global = 0. Which means we just don't know
> > where the first global is in the table. And so we will just search the
> > whole table (1, syments). That means we just don't do the optimization
> 
> It has functionality impact, that means we will ignore the first global symbol
> of minidebuginfo as search_table will be called with (1, syments) as you say
> but in such case symbol #0 is a valid one - from minidebuginfo (shifted to
> number #1 there).

That could only happen if also mod->syments = 0, aka there is no dynsym at
all. But then we will not get here, because...
 
> Yes, and this is a bug.  In the testcase below are perfectly valid shdrs.
> 
> 1003		case DWFL_E_NO_SYMTAB:
> 1004		  if (symscn != NULL)
> 1005		    {
> 1006		      /* We still have the dynamic symbol table.  */
> 1007		      mod->symerr = DWFL_E_NOERROR;
> 1008	
> 1009		      /* The dynsym table might be extended by an auxiliary table.  */
> 1010		      find_aux_sym (mod, &aux_symscn, &aux_xndxscn, &aux_strshndx);
> 1011		      break;
> 1012		    }
> 
> minidebuginfo may exist even if there is no .symtab/.dynsym and therefore
> SYMSCN == NULL.
> 
> Attached such example.
> 
> echo 'int main (void) { return 0; }' >3.c
> gcc -o 3 3.c -Wall -static -s
> objcopy --add-section .gnu_debugdata=/path/to/gdb/testsuite/gdb.base/gnu-debugdata.mini_debuginfo.xz 3
> 
> GDB in such cas displays symbols from minidebuginfo correctly (it complains
> a bit as this testcase is unclean but the purpose works).
> 
> But dwfl_module_getsymtab() returns 0.

Right. The code indeed assumes that the auxiliary table is always in addition to a
minimal dynsym table. Thanks for the testcase, I can see if it is easy to support it with
aux table == full table.

I do wonder how realistic it is that we will ever encounter such a case though. Is
this very contrived or do you think people will actually use .gnu_debugdata this way?

Thanks,

Mark

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]