[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH v8.1 14/27] xsplice, symbols: Implement symbol name resolution on address.



> >+unsigned long xsplice_symbols_lookup_by_name(const char *symname)
> >+{
> >+    struct payload *data;
> 
> Do you need symbols other than those marked "new_symbol" past the loading
> of the module? If not, wouldn't it be worthwhile to shrink the symbol table 
> to just
> those, likely speeding up the lookup?

Ross hopefully answered that to your satisfaction?
> 
> >@@ -379,11 +405,129 @@ static int prepare_payload(struct payload *payload,
>          >for ( j = 0; j < ARRAY_SIZE(f->u.pad); j++ )
>              >if ( f->u.pad[j] )
>                  >return -EINVAL;
> >+
> >+        /* Lookup function's old address if not already resolved. */
> >+        if ( !f->old_addr )
> >+        {
> >+            f->old_addr = (void *)symbols_lookup_by_name(f->name);
> >+            if ( !f->old_addr )
> >+            {
> >+                f->old_addr = (void 
> >*)xsplice_symbols_lookup_by_name(f->name);
> 
> The two casts make me wonder whether the two functions shouldn't return
> void *, and then whether struct xsplice_symbol's value field shouldn't then
> perhaps be void * too.

So I did try that and it all worked nicely on x86. However on ARM32:

arm <konrad@localhost:~/xen/xen> make -j8 1>1
symbols.c: In function 'symbols_lookup_by_name':
symbols.c:287:20: error: cast to pointer from integer of different size
[-Werror=int-to-pointer-cast]

275     uint64_t addr = 0; /* MUST be initialized. */                           
    

286         if ( !strcmp(name, symname) )                                       
    
287             return (void *)addr; 

Which is rather unfortunate. I think I will have to make it unsigned
long.
> 
> >+                if ( !f->old_addr )
> >+                {
> >+                    dprintk(XENLOG_ERR, XSPLICE "%s: Could not resolve old 
> >address of %s\n",
> >+                            elf->name, f->name);
> >+                    return -ENOENT;
> >+                }
> >+            }
> >+            dprintk(XENLOG_DEBUG, XSPLICE "%s: Resolved old address %s => 
> >%p\n",
> >+                    elf->name, f->name, f->old_addr);
> >+        }
>      >}
>  >
>      >return 0;
>  >}
>  
> So one thing I'm realizing only now: Is there no support for using 
> <symbol>+<offset>
> to fill ->old_addr?

No. Just <symbol>. I updated the design document to outline this missing
functionality in the Todo section.

> 
> >+static bool_t is_payload_symbol(const struct xsplice_elf *elf,
> >+                                const struct xsplice_elf_sym *sym)
> >+{
> >+    if ( sym->sym->st_shndx == SHN_UNDEF ||
> >+         sym->sym->st_shndx >= elf->hdr->e_shnum )
> >+        return 0;
> >+
> >+    return (elf->sec[sym->sym->st_shndx].sec->sh_flags & SHF_ALLOC) &&
> >+            (ELF64_ST_TYPE(sym->sym->st_info) == STT_OBJECT ||
> >+             ELF64_ST_TYPE(sym->sym->st_info) == STT_FUNC);
> 
> I don't recall having seen a reply to the question on not allowing STT_NOTYPE 
> here.

Ross, could you elaborate a bit please on this?

> 
> >+static int build_symbol_table(struct payload *payload,
> >+                              const struct xsplice_elf *elf)
> >+{
..snip..
> >+
> >+    /* Recall that section @0 is always NULL. */
> >+    for ( i = 1; i < elf->nsym; i++ )
> >+    {
> >+            symtab[nsyms].new_symbol = 0; /* To be checked below. */
> 
> Why "checked"? The only thing happening further down is this possibly
> getting overwritten with 1.

I changed it to say "May be overwritten below."

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.