[LLVMdev] Need to create symbols only once

Shankar Easwaran
Mon, 07 Jan 2013 23:23:31 -0000

Hi Nick,

On 12/7/2012 4:59 PM, Nick Kledzik wrote:
>
> We have a similar requirement in darwin's ld64 linker, but even more
general.  Any binary can do the following to introspect itself:
>
> struct stuff { int a; int b; };
>
> extern struct stuff*  stuff_start
__asm("section$start$__DATA$__my");
> extern struct stuff*  stuff_end
__asm("section$end$__DATA$__my");
>
> void examineSection() {
> 	const struct stuff* p;
> 	for (p = stuff_start; p < stuff_end; ++p) {
> 		// do stuff with p
> 	}
> }
>
> That is, there are magic symbol names which reference the beginning or
ending of any particular section.   To support this, the linker lazily creates
atoms when references to these magic symbols are discovered during resolving.
>
> I have some hooks for this already in place in lld:
>
> 1) There is Writer::addFiles().  This method gives any writer a change to
add files/atoms to the set of atoms the Resolver works on.   The
Writer::addFiles() method is called after all input files are added.  If you
want to add something lazily (like darwin linker does for section$start$
symbols), the writer returns a File object akin to a static library.  That it,
it provides no initial atoms, but can provide atoms as a last resort (so an .o
files would override it).  The WriterMachO already uses the addFiles() method to
add CRuntime symbols.
>
> 2) DefinedAtom::ContentType already has typeFirstInSection and
typeLastInSection.  These are intended to be used for the content type of the
atoms which represent the magic symbols for the start and end of a section.  The
key here is that the Pass (not written yet) which sorts atoms, knows to sort
these atoms to the start or end of their respective sections.
>
> If you don't want this full general, lazy approach, you could have your
WriteELF::addFiles() return a regular object file that has atoms named
__bss_start and __bss_end, but they are marked mergeAsWeak so that any user
defined atoms will override them.
The case I have is a bit different now. I added symbols
__bss_start/__bss_end/_end using WriterELF::addFiles(). The symbols get
overridden appropriately but the value of the symbols are known only
after the sections have been merged and the virtual addresses assigned
to those symbols.

So when I am trying to write these atoms to the output file, I want to
set the value of these symbols to the values computed by the ELF Writer.

These atoms are NativeAtoms and i dont see a function to set the value
of the atom, How do I go about accomplishing this functionality.