[LLVMdev] [lld] Allow atoms with empty name in the RefNameBuilder::buildDuplicateNameMap()
Simon Atanasyan
simon at atanasyan.com
Wed Feb 5 11:56:57 PST 2014
I have read ELF specification once again. There is no any explicit
references to absolute symbols with no name. The only real case when I
see such symbol is a local absolute symbol with "STT_FILE" type. The
name of "STT_FILE" symbol is a name of the source file associated with
the object file and the "STT_FILE" symbol precedes the other STB_LOCAL
symbols from this object file. So it is just a "marker" symbol.
If think it's enough to do not call buildDuplicateNameMap() if the
absolute atom has no name. I suggest to fix that in the code and write
a test covers this case.
--
Simon
On Wed, Feb 5, 2014 at 5:06 AM, Nick Kledzik <kledzik at apple.com> wrote:
> The point of the RefNameBuilder is to create unique names for atoms
> that need them. For instance, if you have two files each with a static
> function named "foo" and you merge the .o files together and dump
> that as yaml, then when some other function has a reference to "foo"
> the yaml would be ambiguous. In that case some alternate (unambiguous)
> name is generated for the "foo" atoms and all uses would use
> the alternate name.
>
> In your case, you seem to have absolute symbols with no name.
> If the atoms for those symbols need to be referenced in the yaml,
> then they would need a name generated, and the assert is blocking that.
> If they are never referenced, then they should not be passed
> to buildDuplicateNameMap().
>
> Notice earlier in the code, for DefinedAtoms, buildDuplicateNameMap()
> is *not* called if the atom has no name. That was done because there
> are unnamed atoms (such as literals) which have no name. But if ELF allows
> absolute symbols with no name, does it allow symbols with no name
> to content in sections?
[...]
> On Feb 4, 2014, at 2:19 PM, Simon Atanasyan <simon at atanasyan.com> wrote:
>> Method RefNameBuilder::buildDuplicateNameMap() has an assert which
>> blocks atoms with empty name. In general it looks reasonable but some
>> toolchains (for example Sourcery CodeBench in both MIPS and ARM
>> editions) can generate an object file contains absolute STT_FILE
>> symbols with empty name. Moreover crt1.o object file from this
>> toolchain has such symbol. I do not know is it a feature or bug but
>> that behavior exists for a long time.
[...]
>> I suggest to remove assert from the
>> RefNameBuilder::buildDuplicateNameMap() method. I think we do not
>> break anything in that case.
More information about the llvm-dev
mailing list