> > > +simple_object_write_add_symbol(simple_object_write *sobj, const char
> > *name,
> > > +size_t size, unsigned int align);
> >
> > Symbols has much more properties in addition to sizes and alignments.
> > We will eventually need to get dwarf writting, so we will need to
> > support them. However right now we only do these fake lto object
> > symbols, so perhaps for start we could kep things simple and assume that
> > size is always 0 and align always 1 or so.
> >
> > Overall this looks like really good start to me (both API and
> > imllementation looks reasonable to me and it is good that you follow the
> > coding convention).  I guess you can create a branch (see git info on
> > the gcc homepage) and put the patch there?
> >
> I can, but I don't have write access to git.  Also, for the next part, I am
This is easy to fix. Follow instructions here
https://gcc.gnu.org/gitwrite.html
and add me as sponsor.  There are also instructions how to produce a
branch on git correctly.
> thinking of properly configuring the driver
> to directly produce an executable or adding debug info. What do you think?

I think we should try to aim to something that can be tested.  If we add
symbol table and get the ELF header right, linker should accept the
object files and properly recognize them as LTO.

What exactly you mean by configuring the driver?

Honza
> --
> Regards
> Rishi
> 
> >
> > I am also adding Ian to CC as he is maintainer of the simple-object and
> > he may have some ideas.
> >
> > Honza
> > >
> > >  /* Release all resources associated with SIMPLE_OBJECT, including any
> > >     simple_object_write_section's that may have been created.  */
> > > diff --git a/libiberty/simple-object-common.h
> > > b/libiberty/simple-object-common.h
> > > index b9d10550d88..df99c9d85ac 100644
> > > --- a/libiberty/simple-object-common.h
> > > +++ b/libiberty/simple-object-common.h
> > > @@ -58,6 +58,24 @@ struct simple_object_write_struct
> > >    simple_object_write_section *last_section;
> > >    /* Private data for the object file format.  */
> > >    void *data;
> > > +  /*The start of the list of symbols.*/
> > > +  simple_object_symbol *symbols;
> > > +  /*The last entry in the list of symbols*/
> > > +  simple_object_symbol *last_symbol;
> > > +};
> > > +
> > > +/*A symbol in object file being created*/
> > > +struct simple_object_symbol_struct
> > > +{
> > > +  /*Next in the list of symbols attached to an
> > > +  simple_object_write*/
> > > +  simple_object_symbol *next;
> > > +  /*The name of this symbol. */
> > > +  char *name;
> > > +  /* Symbol value */
> > > +  unsigned int align;
> > > +  /* Symbol size */
> > > +  size_t size;
> > >  };
> > >
> > >  /* A section in an object file being created.  */
> > > diff --git a/libiberty/simple-object-elf.c
> > b/libiberty/simple-object-elf.c
> > > index eee07039984..cbba88186bd 100644
> > > --- a/libiberty/simple-object-elf.c
> > > +++ b/libiberty/simple-object-elf.c
> > > @@ -787,9 +787,9 @@ simple_object_elf_write_ehdr (simple_object_write
> > > *sobj, int descriptor,
> > >      ++shnum;
> > >    if (shnum > 0)
> > >      {
> > > -      /* Add a section header for the dummy section and one for
> > > -     .shstrtab.  */
> > > -      shnum += 2;
> > > +      /* Add a section header for the dummy section,
> > > +     .shstrtab, .symtab and .strtab.  */
> > > +      shnum += 4;
> > >      }
> > >
> > >    ehdr_size = (cl == ELFCLASS32
> > > @@ -882,6 +882,51 @@ simple_object_elf_write_shdr (simple_object_write
> > > *sobj, int descriptor,
> > >                         errmsg, err);
> > >  }
> > >
> > > +/* Write out an ELF Symbol*/
> > > +
> > > +static int
> > > +simple_object_elf_write_symbol(simple_object_write *sobj, int
> > descriptor,
> > > +            off_t offset, unsigned int st_name, unsigned int st_value,
> > > size_t st_size,
> > > +            unsigned char st_info, unsigned char st_other, unsigned int
> > > st_shndx,
> > > +            const char **errmsg, int *err)
> > > +{
> > > +  struct simple_object_elf_attributes *attrs =
> > > +    (struct simple_object_elf_attributes *) sobj->data;
> > > +  const struct elf_type_functions* fns;
> > > +  unsigned char cl;
> > > +  size_t sym_size;
> > > +  unsigned char buf[sizeof (Elf64_External_Shdr)];
> > > +
> > > +  fns = attrs->type_functions;
> > > +  cl = attrs->ei_class;
> > > +
> > > +  sym_size = (cl == ELFCLASS32
> > > +           ? sizeof (Elf32_External_Shdr)
> > > +           : sizeof (Elf64_External_Shdr));
> > > +  memset (buf, 0, sizeof (Elf64_External_Shdr));
> > > +
> > > +  if(cl==ELFCLASS32)
> > > +  {
> > > +    ELF_SET_FIELD(fns, cl, Sym, buf, st_name, Elf_Word, st_name);
> > > +    ELF_SET_FIELD(fns, cl, Sym, buf, st_value, Elf_Addr, st_value);
> > > +    ELF_SET_FIELD(fns, cl, Sym, buf, st_size, Elf_Addr, st_size);
> > > +    buf[4]=st_info;
> > > +    buf[5]=st_other;
> > > +    ELF_SET_FIELD(fns, cl, Sym, buf, st_shndx, Elf_Half, st_shndx);
> > > +  }
> > > +  else
> > > +  {
> > > +    ELF_SET_FIELD(fns, cl, Sym, buf, st_name, Elf_Word, st_name);
> > > +    buf[4]=st_info;
> > > +    buf[5]=st_other;
> > > +    ELF_SET_FIELD(fns, cl, Sym, buf, st_shndx, Elf_Half, st_shndx);
> > > +    ELF_SET_FIELD(fns, cl, Sym, buf, st_value, Elf_Addr, st_value);
> > > +    ELF_SET_FIELD(fns, cl, Sym, buf, st_size, Elf_Addr, st_size);
> > > +  }
> > > +  return simple_object_internal_write(descriptor, offset,buf,sym_size,
> > > +              errmsg,err);
> > > +}
> > > +
> > >  /* Write out a complete ELF file.
> > >     Ehdr
> > >     initial dummy Shdr
> > > @@ -932,8 +977,8 @@ simple_object_elf_write_to_file (simple_object_write
> > > *sobj, int descriptor,
> > >    if (shnum == 0)
> > >      return NULL;
> > >
> > > -  /* Add initial dummy Shdr and .shstrtab.  */
> > > -  shnum += 2;
> > > +  /* Add initial dummy Shdr, .shstrtab, .symtab and .strtab.  */
> > > +  shnum += 4;
> > >
> > >    shdr_offset = ehdr_size;
> > >    sh_offset = shdr_offset + shnum * shdr_size;
> > > @@ -1036,6 +1081,70 @@ simple_object_elf_write_to_file
> > (simple_object_write
> > > *sobj, int descriptor,
> > >        sh_offset += sh_size;
> > >      }
> > >
> > > +  unsigned int num_sym=1;
> > > +  simple_object_symbol *symbol;
> > > +
> > > +  for(symbol=sobj->symbols;symbol!=NULL;symbol=symbol->next)
> > > +  {
> > > +    ++num_sym;
> > > +  }
> > > +
> > > +  size_t
> > >
> > sym_size=cl==ELFCLASS32?sizeof(Elf32_External_Sym):sizeof(Elf64_External_Sym);
> > > +  size_t sh_addralign=cl==ELFCLASS32?0x04:0x08;
> > > +  size_t sh_entsize=sym_size;
> > > +  size_t sh_size=num_sym*sym_size;
> > > +  unsigned int sh_info=2;
> > > +  if (!simple_object_elf_write_shdr (sobj, descriptor, shdr_offset,
> > > +                     sh_name, SHT_SYMTAB, 0, 0, sh_offset,
> > > +                     sh_size, shnum-2, sh_info,
> > > +                     sh_addralign,sh_entsize, &errmsg, err))
> > > +    return errmsg;
> > > +  shdr_offset += shdr_size;
> > > +  sh_name+=strlen(".symtab")+1;
> > > +  /*Writes out the dummy symbol */
> > > +
> > > +  if(!simple_object_elf_write_symbol(sobj, descriptor, sh_offset,
> > > +        0,0,0,0,0,SHN_UNDEF,&errmsg,err))
> > > +    return errmsg;
> > > +  sh_offset+=sym_size;
> > > +  unsigned int st_name=1;
> > > +  for(symbol=sobj->symbols;symbol!=NULL;symbol=symbol->next)
> > > +  {
> > > +    unsigned int st_value=1;
> > > +    unsigned int st_size=1;
> > > +    unsigned char st_info=17;
> > > +    if(!simple_object_elf_write_symbol(sobj, descriptor, sh_offset,
> > > +        st_name,st_value,st_size,st_info,0,SHN_COMMON,&errmsg,err))
> > > +      return errmsg;
> > > +    sh_offset+=sym_size;
> > > +    st_name+=strlen(symbol->name)+1;
> > > +
> > > +  }
> > > +
> > > +  if (!simple_object_elf_write_shdr (sobj, descriptor, shdr_offset,
> > > +                     sh_name, SHT_STRTAB, 0, 0, sh_offset,
> > > +                     st_name, 0, 0,
> > > +                     1, 0, &errmsg, err))
> > > +    return errmsg;
> > > +  shdr_offset += shdr_size;
> > > +  sh_name+=strlen(".strtab")+1;
> > > +  /*.strtab has a leading zero byte*/
> > > +  zero = 0;
> > > +  if (!simple_object_internal_write (descriptor, sh_offset, &zero, 1,
> > > +                     &errmsg, err))
> > > +    return errmsg;
> > > +  ++sh_offset;
> > > +
> > > +  for(symbol=sobj->symbols;symbol!=NULL;symbol=symbol->next)
> > > +  {
> > > +    size_t len=strlen(symbol->name)+1;
> > > +    if (!simple_object_internal_write (descriptor, sh_offset,
> > > +                     (const unsigned char *) symbol->name,
> > > +                     len, &errmsg, err))
> > > +    return errmsg;
> > > +      sh_offset += len;
> > > +
> > > +  }
> > >    if (!simple_object_elf_write_shdr (sobj, descriptor, shdr_offset,
> > >                       sh_name, SHT_STRTAB, 0, 0, sh_offset,
> > >                       sh_name + strlen (".shstrtab") + 1, 0, 0,
> > > @@ -1060,7 +1169,16 @@ simple_object_elf_write_to_file
> > (simple_object_write
> > > *sobj, int descriptor,
> > >      return errmsg;
> > >        sh_offset += len;
> > >      }
> > > -
> > > +  if (!simple_object_internal_write (descriptor, sh_offset,
> > > +                     (const unsigned char *) ".symtab",
> > > +                     strlen (".symtab") + 1, &errmsg, err))
> > > +    return errmsg;
> > > +  sh_offset+=strlen(".symtab")+1;
> > > +  if (!simple_object_internal_write (descriptor, sh_offset,
> > > +                     (const unsigned char *) ".strtab",
> > > +                     strlen (".strtab") + 1, &errmsg, err))
> > > +    return errmsg;
> > > +  sh_offset+=strlen(".strtab")+1;
> > >    if (!simple_object_internal_write (descriptor, sh_offset,
> > >                       (const unsigned char *) ".shstrtab",
> > >                       strlen (".shstrtab") + 1, &errmsg, err))
> > > diff --git a/libiberty/simple-object.c b/libiberty/simple-object.c
> > > index 163e58a2f3b..73622160248 100644
> > > --- a/libiberty/simple-object.c
> > > +++ b/libiberty/simple-object.c
> > > @@ -455,6 +455,8 @@ simple_object_start_write (simple_object_attributes
> > > *attrs,
> > >    ret->sections = NULL;
> > >    ret->last_section = NULL;
> > >    ret->data = data;
> > > +  ret->symbols=NULL;
> > > +  ret->last_symbol=NULL;
> > >    return ret;
> > >  }
> > >
> > > @@ -538,6 +540,28 @@ simple_object_write_to_file (simple_object_write
> > > *sobj, int descriptor,
> > >  {
> > >    return sobj->functions->write_to_file (sobj, descriptor, err);
> > >  }
> > > +/*Adds a symbol in to common*/
> > > +void
> > > +simple_object_write_add_symbol(simple_object_write *sobj, const char
> > *name,
> > > +size_t size, unsigned int align)
> > > +{
> > > +  simple_object_symbol *symbol;
> > > +  symbol=XNEW(simple_object_symbol);
> > > +  symbol->next=NULL;
> > > +  symbol->name=xstrdup(name);
> > > +  symbol->align=align;
> > > +  symbol->size=size;
> > > +  if(sobj->last_symbol==NULL)
> > > +  {
> > > +    sobj->symbols=symbol;
> > > +    sobj->last_symbol=symbol;
> > > +  }
> > > +  else
> > > +  {
> > > +    sobj->last_symbol->next=symbol;
> > > +    sobj->last_symbol=symbol;
> > > +  }
> > > +}
> > >
> > >  /* Release an simple_object_write.  */
> > >
> > > @@ -571,6 +595,14 @@ simple_object_release_write (simple_object_write
> > *sobj)
> > >        XDELETE (section);
> > >        section = next_section;
> > >      }
> > > +  simple_object_symbol *symbol;
> > > +  symbol=sobj->symbols;
> > > +  while(symbol!=NULL)
> > > +  {
> > > +    free(symbol->name);
> > > +    XDELETE(symbol);
> > > +    symbol=symbol->next;
> > > +  }
> > >
> > >    sobj->functions->release_write (sobj->data);
> > >    XDELETE (sobj);
> > > --
> > > 2.40.1
> >

Reply via email to