Here is a proposal for STT_GNU_IFUNC and R_*_IRELATIVE. It has been implemented in the Linux binutils 2.19.51.0.5.
H.J. ---- STT_GNU_IFUNC
This symbol type is the same as STT_FUNC except that it always points to a function or piece of executable code which takes no arguments and returns a function pointer. If an STT_GNU_IFUNC symbol is referred to by a relocation, then evaluation of that relocation is delayed until load-time. The value used in the relocation is the function pointer returned by an invocation of the STT_GNU_IFUNC symbol.
The purpose of this symbol type is to allow the run-time to select between multiple versions of the implementation of a specific function. The selection made in general will take the currently available hardware into account and select the most appropriate version.
STT_GNU_IFUNC is defined in OS-specific range:
#define STT_LOOS 10 /* OS-specific semantics */ #define STT_GNU_IFUNC 10 /* Symbol is an indirect code object */ #define STT_HIOS 12 /* OS-specific semantics */
R_*_IRELATIVE
This relocation is similar to R_*_RELATIVE except that the value used in this relocation is the program address returned by the function, which takes no arguments, at the address of the result of the corresponding R_*_RELATIVE relocation.
The purpose of this relocation to avoid name lookup for locally defined STT_GNU_IFUNC symbols at load-time.
R_*_IRELATIVE is defined for i386 and x86-64:
#define R_386_IRELATIVE 42 /* Adjust indirectly by program base */ #define R_X86_64_IRELATIVE 37 /* Adjust indirectly by program base */
I have to admit that I don't see why a new symbol type *and* a new relocation type would be necessary here. If the to-be-relocated symbols' name is to not appear in the original (dynamic) symbol table, then all that is needed is a second relocation section referencing a second (in the case of non-ET_REL objects perhaps the static) symbol table. Whether this split would really be necessary in ET_REL objects I doubt in the first place, so it's perhaps just a job of the static linker to separate the relocations accordingly. The consequence would be the need for a new set of DT_* tags, which, along with the symbol type, ought to be OS-specific (whereas the new relocation type is OS-independent, and hence meaningless for OSes not supporting STT_GNU_IFUNC).
Here is a proposal for STT_GNU_IFUNC and R_*_IRELATIVE. It has been implemented in the Linux binutils 2.19.51.0.5.
H.J. ---- STT_GNU_IFUNC
This symbol type is the same as STT_FUNC except that it always points to a function or piece of executable code which takes no arguments and returns a function pointer. If an STT_GNU_IFUNC symbol is referred to by a relocation, then evaluation of that relocation is delayed until load-time. The value used in the relocation is the function pointer returned by an invocation of the STT_GNU_IFUNC symbol.
The purpose of this symbol type is to allow the run-time to select between multiple versions of the implementation of a specific function. The selection made in general will take the currently available hardware into account and select the most appropriate version.
STT_GNU_IFUNC is defined in OS-specific range:
#define STT_LOOS 10 /* OS-specific semantics */ #define STT_GNU_IFUNC 10 /* Symbol is an indirect code object */ #define STT_HIOS 12 /* OS-specific semantics */
R_*_IRELATIVE
This relocation is similar to R_*_RELATIVE except that the value used in this relocation is the program address returned by the function, which takes no arguments, at the address of the result of the corresponding R_*_RELATIVE relocation.
The purpose of this relocation to avoid name lookup for locally defined STT_GNU_IFUNC symbols at load-time.
R_*_IRELATIVE is defined for i386 and x86-64:
#define R_386_IRELATIVE 42 /* Adjust indirectly by program base */ #define R_X86_64_IRELATIVE 37 /* Adjust indirectly by program base */
Jan Beulich wrote: > I have to admit that I don't see why a new symbol type *and* a new > relocation type would be necessary here. If the to-be-relocated symbols' > name is to not appear in the original (dynamic) symbol table, then all that is > needed is a second relocation section referencing a second (in the case of > non-ET_REL objects perhaps the static) symbol table.
The static symbol table is gone. But aside from that, there is no existing relocation which meets the requirements. The lookup must only ever happen locally and not along the search path. Beside, anything but the proposed relocation is an unnecessary burden.
> Whether this split > would really be necessary in ET_REL objects I doubt in the first place, so > it's perhaps just a job of the static linker to separate the relocations > accordingly.
Huh? This new relocation type only exists in executables.
> and hence meaningless for > OSes not supporting STT_GNU_IFUNC).
The symbol type is OS-specific after talking with stakeholders in other OS. And it's not my fault that there is no OS-specific range for relocations. There are enough numbers left for x86 and x86-64 so that this isn't an issue.
I don't know HJ's reasons for posting this on this list. I don't consider any of this up for discussion. If some OS wants to not implement this, by all means, don't do it. This doesn't mean the rest can or should be held back.
- -- ➧ Ulrich Drepper ➧ Red Hat, Inc. ➧ 444 Castro St ➧ Mountain View, CA ❖ -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.9 (GNU/Linux)
Since only Linux is interested in the new type, we make it OS specific.
2. How should locally defined symbols with the new type be handled?
I don't see the fundamental difference between the new relocation and the new DT_* tags. The end result is the same. If your OS doesn't support them, the application will crash if they are used. I will propose a new x86-64 psABI extension, which will be optional. If an OS supports STT_GNU_IFUNC, it must support R_X86_64_IRELATIVE.
On Mon, May 25, 2009 at 11:52 PM, Jan Beulich <JBeul...@novell.com> wrote: > I have to admit that I don't see why a new symbol type *and* a new > relocation type would be necessary here. If the to-be-relocated symbols' > name is to not appear in the original (dynamic) symbol table, then all that is > needed is a second relocation section referencing a second (in the case of > non-ET_REL objects perhaps the static) symbol table. Whether this split > would really be necessary in ET_REL objects I doubt in the first place, so > it's perhaps just a job of the static linker to separate the relocations > accordingly. The consequence would be the need for a new set of DT_* > tags, which, along with the symbol type, ought to be OS-specific (whereas > the new relocation type is OS-independent, and hence meaningless for > OSes not supporting STT_GNU_IFUNC).
> Here is a proposal for STT_GNU_IFUNC and R_*_IRELATIVE. It > has been implemented in the Linux binutils 2.19.51.0.5.
> H.J. > ---- > STT_GNU_IFUNC
> This symbol type is the same as STT_FUNC except that it always > points to a function or piece of executable code which takes no > arguments and returns a function pointer. If an STT_GNU_IFUNC > symbol is referred to by a relocation, then evaluation of that > relocation is delayed until load-time. The value used in the > relocation is the function pointer returned by an invocation > of the STT_GNU_IFUNC symbol.
> The purpose of this symbol type is to allow the run-time to > select between multiple versions of the implementation of a > specific function. The selection made in general will take the > currently available hardware into account and select the most > appropriate version.
> STT_GNU_IFUNC is defined in OS-specific range:
> #define STT_LOOS 10 /* OS-specific semantics */ > #define STT_GNU_IFUNC 10 /* Symbol is an indirect code object */ > #define STT_HIOS 12 /* OS-specific semantics */
> R_*_IRELATIVE
> This relocation is similar to R_*_RELATIVE except that the > value used in this relocation is the program address returned > by the function, which takes no arguments, at the address of > the result of the corresponding R_*_RELATIVE relocation.
> The purpose of this relocation to avoid name lookup for locally > defined STT_GNU_IFUNC symbols at load-time.
> R_*_IRELATIVE is defined for i386 and x86-64:
> #define R_386_IRELATIVE 42 /* Adjust indirectly by program base */ > #define R_X86_64_IRELATIVE 37 /* Adjust indirectly by program base */
> I don't know HJ's reasons for posting this on this list. I don't > consider any of this up for discussion. If some OS wants to not > implement this, by all means, don't do it. This doesn't mean the rest > can or should be held back.
It is mainly informationally so that I can refer people to this post later if someone is interested in it.
>>> "H.J. Lu" <hjl.to...@gmail.com> 26.05.09 16:39 >>> >2. How should locally defined symbols with the new type be handled?
>I don't see the fundamental difference between the new relocation and >the new DT_* tags. The end result is the same. If your OS doesn't support >them, the application will crash if they are used. I will propose a new >x86-64 psABI extension, which will be optional. If an OS supports >STT_GNU_IFUNC, it must support R_X86_64_IRELATIVE.
The fundamental difference is that the new-relocation-type approach is not matching the general ELF idea, whereas the new dynamic-tag-approach fits well with other ELF definitions.
On Tue, May 26, 2009 at 8:31 AM, Jan Beulich <JBeul...@novell.com> wrote: >>>> "H.J. Lu" <hjl.to...@gmail.com> 26.05.09 16:39 >>> >>2. How should locally defined symbols with the new type be handled?
>>I don't see the fundamental difference between the new relocation and >>the new DT_* tags. The end result is the same. If your OS doesn't support >>them, the application will crash if they are used. I will propose a new >>x86-64 psABI extension, which will be optional. If an OS supports >>STT_GNU_IFUNC, it must support R_X86_64_IRELATIVE.
> The fundamental difference is that the new-relocation-type approach is > not matching the general ELF idea, whereas the new dynamic-tag-approach > fits well with other ELF definitions.
Relocation types are defined in the psABI. I don't see any problems with R_X86_64_IRELATIVE.
Late last year there was a discussion in regards STT_IFUNC, and we thought you'd settled on this name (no _GNU_) and the associated value of 7.
I guess we jumped the gun. Although we have no immediate plans to implement support for this, we did reserve the name-space, so that if nothing else we could identify new objects with this definition:
On Tue, May 26, 2009 at 9:40 AM, Rod Evans <Rod.Ev...@sun.com> wrote: > Late last year there was a discussion in regards STT_IFUNC, and we > thought you'd settled on this name (no _GNU_) and the associated > value of 7.
> I guess we jumped the gun. Although we have no immediate plans to > implement support for this, we did reserve the name-space, so that > if nothing else we could identify new objects with this definition:
But since 7 is the last used generic symbol type and not all OSes agree on STT_IFUNC, we moved it to OS specific range. We can't wait forever on STT_IFUNC. If we want STT_IFUNC, we should do it now. Otherwise we will use STT_GNU_IFUNC.
>> I don't see the fundamental difference between the new relocation and >> the new DT_* tags. The end result is the same. If your OS doesn't support >> them, the application will crash if they are used. I will propose a new >> x86-64 psABI extension, which will be optional. If an OS supports >> STT_GNU_IFUNC, it must support R_X86_64_IRELATIVE.
> One difference is that a new relocation has to be defined for every > processor ABI separately. New DT_* tags can be defined once.
Sure. But R_*_IRELATIVE is much simpler to implement in static and dynamic linkers.
"H.J. Lu" <hjl.to...@gmail.com> writes: > On Tue, May 26, 2009 at 9:30 AM, Ian Lance Taylor <i...@google.com> wrote: >> "H.J. Lu" <hjl.to...@gmail.com> writes:
>>> I don't see the fundamental difference between the new relocation and >>> the new DT_* tags. The end result is the same. If your OS doesn't support >>> them, the application will crash if they are used. I will propose a new >>> x86-64 psABI extension, which will be optional. If an OS supports >>> STT_GNU_IFUNC, it must support R_X86_64_IRELATIVE.
>> One difference is that a new relocation has to be defined for every >> processor ABI separately. New DT_* tags can be defined once.
> Sure. But R_*_IRELATIVE is much simpler to implement in static and > dynamic linkers.
That is not a convincing argument when it comes to standardizing something. The DT_* tags are not difficult to implement.
Jakub's comment about prelink seems relevant, however.
On Tue, May 26, 2009 at 8:43 AM, H.J. Lu <hjl.to...@gmail.com> wrote: > On Tue, May 26, 2009 at 8:31 AM, Jan Beulich <JBeul...@novell.com> wrote: >>>>> "H.J. Lu" <hjl.to...@gmail.com> 26.05.09 16:39 >>> >>>2. How should locally defined symbols with the new type be handled?
>>>I don't see the fundamental difference between the new relocation and >>>the new DT_* tags. The end result is the same. If your OS doesn't support >>>them, the application will crash if they are used. I will propose a new >>>x86-64 psABI extension, which will be optional. If an OS supports >>>STT_GNU_IFUNC, it must support R_X86_64_IRELATIVE.
>> The fundamental difference is that the new-relocation-type approach is >> not matching the general ELF idea, whereas the new dynamic-tag-approach >> fits well with other ELF definitions.
> Relocation types are defined in the psABI. I don't see any problems > with R_X86_64_IRELATIVE.
Rod Evans wrote: > Late last year there was a discussion in regards STT_IFUNC, and we > thought you'd settled on this name (no _GNU_) and the associated > value of 7.
No. Because _you_ said you don't want this we settled on an OS-specific value and name.
> I assume we should now remove this dead-wood and reserve the STT_LOOS > value instead.
Why reserve it? It's OS-specific. Nobody will crowd that range but you and if you should use it and it's a different value, then it doesn't matter either.
- -- ➧ Ulrich Drepper ➧ Red Hat, Inc. ➧ 444 Castro St ➧ Mountain View, CA ❖ -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.9 (GNU/Linux)
Ulrich Drepper wrote: > Rod Evans wrote: >> Late last year there was a discussion in regards STT_IFUNC, and we >> thought you'd settled on this name (no _GNU_) and the associated >> value of 7.
> No. Because _you_ said you don't want this we settled on an OS-specific > value and name.
I said I had some reservations about it's implementation, and that we had no immediate plans on implementing it. We thought the number had been decided.
>> I assume we should now remove this dead-wood and reserve the STT_LOOS >> value instead.
> Why reserve it? It's OS-specific. Nobody will crowd that range but you > and if you should use it and it's a different value, then it doesn't > matter either.
We try and keep track of various ELF definitions, so that we can at least identify them in a user friendly manner.
On Mon, May 25, 2009 at 11:52 PM, Jan Beulich <JBeul...@novell.com> wrote: > I have to admit that I don't see why a new symbol type *and* a new > relocation type would be necessary here. If the to-be-relocated symbols' > name is to not appear in the original (dynamic) symbol table, then all that is > needed is a second relocation section referencing a second (in the case of > non-ET_REL objects perhaps the static) symbol table. Whether this split > would really be necessary in ET_REL objects I doubt in the first place, so > it's perhaps just a job of the static linker to separate the relocations > accordingly. The consequence would be the need for a new set of DT_* > tags, which, along with the symbol type, ought to be OS-specific (whereas > the new relocation type is OS-independent, and hence meaningless for > OSes not supporting STT_GNU_IFUNC).
After looking another look, DT_* may be a good idea. STT_GNU_IFUNC can be in DSO, dynamic executable and static executable. We need a way to make it to work for all 3 cases. I think we can use DT_XXX to mark the indirect relocation table for relocations against locally defined STT_GNU_IFUNC symbols
DT_IRELA This element holds the address of the indirect relocation table with explicit addends, such as Elf32_Rela for the 32-bit file class or Elf64_Rela for the 64-bit file class. If this element is present, the dynamic structure must also have DT_IRELASZ and DT_IRELAENT elements.
DT_IRELASZ This element holds the total size, in bytes, of the DT_IRELA relocation table.
DT_IRELAENT This element holds the size, in bytes, of the DT_IRELA relocation entry.
DT_IREL This element is similar to DT_IRELA, except its table has implicit addends, such as Elf32_Rel for the 32-bit file class or Elf64_Rel for the 64-bit file class. If this element is present, the dynamic structure must also have DT_IRELSZ and DT_IRELENT elements.
DT_IRELSZ This element holds the total size, in bytes, of the DT_IREL relocation table.
DT_IRELENT This element holds the size, in bytes, of the DT_IREL relocation entry.
Relocations in the indirect relocation table don't require name lookup and their symbol values are zero. The value used in the relocation is the program address returned by the function, which takes no arguments, at the address of the result of the corresponding R_*_* relocation.
The purpose of the indirect relocation table to support executables and avoid name lookup for locally defined STT_GNU_IFUNC symbols at load-time.
The indirect relocation table is optional. Either DT_IRELA or DT_IREL may occur, not both. It should processed as soon as the object is relocated.
> Here is a proposal for STT_GNU_IFUNC and R_*_IRELATIVE. It > has been implemented in the Linux binutils 2.19.51.0.5.
> H.J. > ---- > STT_GNU_IFUNC
> This symbol type is the same as STT_FUNC except that it always > points to a function or piece of executable code which takes no > arguments and returns a function pointer. If an STT_GNU_IFUNC > symbol is referred to by a relocation, then evaluation of that > relocation is delayed until load-time. The value used in the > relocation is the function pointer returned by an invocation > of the STT_GNU_IFUNC symbol.
> The purpose of this symbol type is to allow the run-time to > select between multiple versions of the implementation of a > specific function. The selection made in general will take the > currently available hardware into account and select the most > appropriate version.
> STT_GNU_IFUNC is defined in OS-specific range:
> #define STT_LOOS 10 /* OS-specific semantics */ > #define STT_GNU_IFUNC 10 /* Symbol is an indirect code object */ > #define STT_HIOS 12 /* OS-specific semantics */
> R_*_IRELATIVE
> This relocation is similar to R_*_RELATIVE except that the > value used in this relocation is the program address returned > by the function, which takes no arguments, at the address of > the result of the corresponding R_*_RELATIVE relocation.
> The purpose of this relocation to avoid name lookup for locally > defined STT_GNU_IFUNC symbols at load-time.
> R_*_IRELATIVE is defined for i386 and x86-64:
> #define R_386_IRELATIVE 42 /* Adjust indirectly by program base */ > #define R_X86_64_IRELATIVE 37 /* Adjust indirectly by program base */
H.J. Lu wrote: > After looking another look, DT_* may be a good idea. STT_GNU_IFUNC > can be in DSO, dynamic executable and static executable. We need a way > to make it to work for all 3 cases.
And? Relocations of course also work in all the cases.
It is a braindead idea to invent a new data structure every time some gets added. Especially if there is already one which perfectly fits the bill. There is no reason whatsoever to not use a relocation. The introduction of a DT_* described data structure just makes things more complicated at runtime.
The argument that only one thing for all architectures has to be changed is irrelevant. The amount of work needed in the linker in negligible. On the other hand, there have to be completely different implementations for the fancy new data structure for different architectures if the function pointer implementation differs.
Using R_*_IRELATIVE relocations is the right way to handle this.
- -- ➧ Ulrich Drepper ➧ Red Hat, Inc. ➧ 444 Castro St ➧ Mountain View, CA ❖ -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.9 (GNU/Linux)
On Wed, May 27, 2009 at 10:27 AM, Ulrich Drepper <drep...@redhat.com> wrote: > -----BEGIN PGP SIGNED MESSAGE----- > Hash: SHA1
> H.J. Lu wrote: >> After looking another look, DT_* may be a good idea. STT_GNU_IFUNC >> can be in DSO, dynamic executable and static executable. We need a way >> to make it to work for all 3 cases.
> And? Relocations of course also work in all the cases.
> It is a braindead idea to invent a new data structure every time some > gets added. Especially if there is already one which perfectly fits the > bill. There is no reason whatsoever to not use a relocation. The > introduction of a DT_* described data structure just makes things more > complicated at runtime.
> The argument that only one thing for all architectures has to be changed > is irrelevant. The amount of work needed in the linker in negligible. > On the other hand, there have to be completely different implementations > for the fancy new data structure for different architectures if the > function pointer implementation differs.
> Using R_*_IRELATIVE relocations is the right way to handle this.
How to do you handle R_*_PC32 relocation to a locally defined STT_GNU_IFUNC symbol in dynamic and static executables?
This is of course not going to work. The program doesn't even contain a R_*_IRELATIVE relocation.
Every call to an IFUNC must be indirect somewhere. You cannot change the relative jmp into an indirect one (opcode is too long). Therefore, as I explained before, you allocate and jump to a PLT slot. The PLT slot as a GOT entry and that GOT entry in modified by the R_*_IRELATIVE relocation.
Of course something can be wrong with the code I get. So, why don't you take the time to actually explain what you see at the asm level.
- -- ➧ Ulrich Drepper ➧ Red Hat, Inc. ➧ 444 Castro St ➧ Mountain View, CA ❖ -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.9 (GNU/Linux)
Relocation section '.rela.ifunc.dyn' at offset 0x430 contains 1 entries: Offset Info Type Sym. Value Sym. Name + Addend 0000004005b6 000400000002 R_X86_64_PC32 foo() foo - 4
Dynamic linker will lookup STT_GNU_IFUNC foo and resolve R_X86_64_PC32. But dynamic linker will segfaut as soon as it tries to run foo () since the text segment isn't executable when it is changed to PROT_READ|PROT_WRITE before updating the text segment.
> This is of course not going to work. The program doesn't even contain a > R_*_IRELATIVE relocation.
> Every call to an IFUNC must be indirect somewhere. You cannot change > the relative jmp into an indirect one (opcode is too long). Therefore, > as I explained before, you allocate and jump to a PLT slot. The PLT > slot as a GOT entry and that GOT entry in modified by the R_*_IRELATIVE > relocation.
The current linker doesn't do that. I will investigate if it is easy to fix, especially for static executables where executable has to manage PLT and GOT itself. Certain static executables like kernel may have
call STT_GNU_IFUNC foo
where the best foo will be selected at boot time for a given hardware. PLT/GOT isn't needed here.
> Relocation section '.rela.ifunc.dyn' at offset 0x430 contains 1 entries: > Offset Info Type Sym. Value Sym. Name + Addend > 0000004005b6 000400000002 R_X86_64_PC32 foo() foo - 4
> Dynamic linker will lookup STT_GNU_IFUNC foo and resolve > R_X86_64_PC32. But dynamic linker will segfaut as soon as > it tries to run foo () since the text segment isn't executable > when it is changed to PROT_READ|PROT_WRITE before > updating the text segment.
Exactly. We must never write to a text segment. Making a text segment writable is simply no option. It's not even possible with the appropriate security policy in place.
Really: text relocations are no solutions. Ever. No new extension must rely on writable text segments.
> Certain static executables like kernel may > have
> call STT_GNU_IFUNC foo
> where the best foo will be selected at boot time for a given hardware. > PLT/GOT isn't needed here.
This doesn't matter. Either a PLT slot has a IRELATIVE relocation attached (no lookup, no dynamic selection) or it is a traditional PLT jump at which point at the first call ld.so will relocate the GOT entry.
- -- ➧ Ulrich Drepper ➧ Red Hat, Inc. ➧ 444 Castro St ➧ Mountain View, CA ❖ -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.9 (GNU/Linux)
>> Relocation section '.rela.ifunc.dyn' at offset 0x430 contains 1 entries:
>> Offset Info Type Sym. Value Sym. Name + Addend
>> 0000004005b6 000400000002 R_X86_64_PC32 foo() foo - 4
>> Dynamic linker will lookup STT_GNU_IFUNC foo and resolve
>> R_X86_64_PC32. But dynamic linker will segfaut as soon as
>> it tries to run foo () since the text segment isn't executable
>> when it is changed to PROT_READ|PROT_WRITE before
>> updating the text segment.
> Exactly. We must never write to a text segment. Making a text segment
> writable is simply no option. It's not even possible with the
> appropriate security policy in place.
> Really: text relocations are no solutions. Ever. No new extension must
> rely on writable text segments.
I got dynamic executable to work. I will work on static executable.
I will try to put my binutils on git.kernel.org.
>> Certain static executables like kernel may
>> have
>> call STT_GNU_IFUNC foo
>> where the best foo will be selected at boot time for a given hardware.
>> PLT/GOT isn't needed here.
> This doesn't matter. Either a PLT slot has a IRELATIVE relocation
> attached (no lookup, no dynamic selection) or it is a traditional PLT
> jump at which point at the first call ld.so will relocate the GOT entry.
> - --
> ➧ Ulrich Drepper ➧ Red Hat, Inc. ➧ 444 Castro St ➧ Mountain View, CA ❖
> -----BEGIN PGP SIGNATURE-----
> Version: GnuPG v1.4.9 (GNU/Linux)
On Wed, May 27, 2009 at 8:55 PM, Alan Modra <amo...@bigpond.net.au> wrote: > Is it true that the new IRELATIVE relocation should only appear in > .plt, and the .plt entries involved are all the size size? If so, ld > can ensure that all such .plt entries are adjacent and emit two new > tags giving the array location and size. No need for new relocations > at all. Also should make ld.so a little faster.
Those RELATIVE relocations only appear in .got.plt on x86. They may appear in shared library, static executable and dynamic executable. I have marked them in static executables. I will see if I can mark them in shared library and dynamic executable.
Alan Modra wrote: > Is it true that the new IRELATIVE relocation should only appear in > .plt, and the .plt entries involved are all the size size? If so, ld > can ensure that all such .plt entries are adjacent and emit two new > tags giving the array location and size.
Once again with the special handling. This isn't faster.
Aside from that, unknown DT_* flags are no fatal errors at program loading time. Unknown relocations are. The result is that with your proposal people running new binaries on old systems will see mysterious crashes or worse, strange results. With new relocations they will see a useful error message and predictable behavior.
- -- ➧ Ulrich Drepper ➧ Red Hat, Inc. ➧ 444 Castro St ➧ Mountain View, CA ❖ -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.9 (GNU/Linux)
> Alan Modra wrote: >> Is it true that the new IRELATIVE relocation should only appear in >> .plt, and the .plt entries involved are all the size size? If so, ld >> can ensure that all such .plt entries are adjacent and emit two new >> tags giving the array location and size.
> Once again with the special handling. This isn't faster.
> Aside from that, unknown DT_* flags are no fatal errors at program > loading time. Unknown relocations are. The result is that with your > proposal people running new binaries on old systems will see mysterious > crashes or worse, strange results. With new relocations they will see a > useful error message and predictable behavior.
> if (__builtin_expect (r_type == R_X86_64_IRELATIVE, 1)) > { > Elf64_Addr value = reloc->r_addend; > value = ((Elf64_Addr (*) (void)) value) (); > *reloc_addr = value; > } > }
> for static executables. It is called from elf-init.c. How can I > report a bad relocation safetly?
In this specific case, fail on anything but the R_*_IRELATIVE relocation. Should there be in future another relocation which has to be handled even in static executables then it'll get it's own 'else if' branch. You don't have to copy into the static executable any relocation except those really needed.
- -- ➧ Ulrich Drepper ➧ Red Hat, Inc. ➧ 444 Castro St ➧ Mountain View, CA ❖ -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.9 (GNU/Linux)