Le mardi 10 août 2010 22:57:13, vous avez écrit :
>  Hi y'all!
> 
>  I used Thomas Preud'homme's patch on the tcc-0.9.25 I had retrieved from
> sourceforge (on Ubuntu Lucid 10.04 x86_64: Linux Gypsy-IV 2.6.32-24-server
> #39-Ubuntu SMP Wed Jul 28 06:21:40 UTC 2010 x86_64 GNU/Linux)
> 
> I the tcc bootstraps again
> the bootstrapped tcc is able to compile the complete Eiffel 6.6.8 system
> and a sample program (freeze/finalize)... the sample program executes
> properly I applied 'patch' on elf.h & tccelf.c,
>  however the 3rd file (tccrun.cc) was nowhere to be found... yet everything
> works (I suspect T had a slightly more recent tcc version)
Indeed, the patch was done against latest mob. modifs in tccrun only affects 
error message (to say where in a file a parse error has occured).

A patch against tcc 0.9.25 is attached to this email
> 
>  Kudos to Thomas!!!
>  Vin
Happy to see that tcc bootstrap again :)

Best regards,

Thomas
> 
>  On 08/09/2010 11:24 AM, Thomas Preud'homme wrote:
> Hi all,
> 
> last version of GNU libc uses symbol with indirect function type (also
> known as STT_GNU_IFUNC) in its recent versions on x86_64 architecture.
> 
> This straightforward patch (pushed on mob with short sha1 bcc9137) allow
> tinycc to build against libraries using such type for symbol. Notes that
> this patch does not allow tcc to build executable or library with such
> symbol type. It only supports linking against such libraries.
> 
> Important note: The documentation I read about STT_GNU_IFUNC symbols says
> that when a code *load* (which is different from jump and calls) such a
> symbol, the value used should be either its GOTPLT (.got.plt) entry or its
> GOT entry depending on the context. I quickly look at the code and saw
> that whenever a STT_FUNC (or also STT_IFUNC now) is used, a GOT *and* a
> PLTGOT entry is created but I don't know which of the two entries is used
> depending on the context. But for what I saw, whenever there is a load,
> it's loaded from the same place (I guess it's loaded from GOT, according
> to first comment in load() in x86_64-gen.c).
> 
> I'm still lacking some tinycc knowledge about the link between source
> parsing and code generation so it would be quite long for me to add the
> necessary support. So could one of the tinycc guru add the code to handle
> this differentiation ? The rules about the value to load (GOTPLT entry or
> GOT entry) are explained in this document:
> 
> http://generic-abi.googlegroups.com/web/ifunc.txt?gda=xtGavTsAAADkRlZw3fTn8
> WF8pRDgf6aLfN_Atkb_cwXe6cZOcg5qrUgoJ4G7--yvLPBq95D3B7sGRdr3QrylPkw2aRbXD_gF
> 
> I quote:
> 
> "Note:
> 
> Instead of branching to an STT_GNU_IFUNC symbol directly, we always
> branch to its PLT entry, which simply loads its GOTPLT entry and branch
> to it.  Its GOTPLT entry has the real function address.  It has an
> optional GOT entry for the function pointer value of the symbol.  To
> load an STT_GNU_IFUNC symbol function pointer value,
> 
> 1. Use its GOTPLT entry in a shared object if it is forced local or not
> dynamic.
> 2. Use its GOTPLT entry in a non-shared object if pointer equality isn't
> needed.
> 3. Use its GOTPLT entry in a position independent executable (PIE).
> 4. Use its GOTPLT entry if no normal GOT, other than GOTPLT, is used.
> 5. Otherwise use its GOT entry.  We only need to relocate its GOT entry
> in a shared object."
> 
> Best regards,
> 
> Thomas Preud'homme
> 
> 
> _______________________________________________
> Tinycc-devel mailing list
> Tinycc-devel@nongnu.org
> http://lists.nongnu.org/mailman/listinfo/tinycc-devel
diff --git a/elf.h b/elf.h
index 82fd7ed..fe694de 100644
--- a/elf.h
+++ b/elf.h
@@ -431,6 +431,7 @@ typedef struct
 #define STT_SECTION     3               /* Symbol associated with a section */
 #define STT_FILE        4               /* Symbol's name is file name */
 #define STT_NUM         5               /* Number of defined types.  */
+#define STT_GNU_IFUNC   10              /* Symbol is a indirect code object */
 #define STT_LOOS        11              /* Start of OS-specific */
 #define STT_HIOS        12              /* End of OS-specific */
 #define STT_LOPROC      13              /* Start of processor-specific */
diff --git a/libtcc.c b/libtcc.c
index ade77c0..c9d37b8 100644
--- a/libtcc.c
+++ b/libtcc.c
@@ -1431,7 +1431,11 @@ static void rt_printline(unsigned long wanted_pc)
             sym < sym_end;
             sym++) {
             type = ELFW(ST_TYPE)(sym->st_info);
+#ifdef STT_IFUNC
+            if ((type == STT_FUNC) || (type == STT_GNU_IFUNC)) {
+#else
             if (type == STT_FUNC) {
+#endif
                 if (wanted_pc >= sym->st_value &&
                     wanted_pc < sym->st_value + sym->st_size) {
                     pstrcpy(last_func_name, sizeof(last_func_name),
diff --git a/tccelf.c b/tccelf.c
index 4020e24..6156cc2 100644
--- a/tccelf.c
+++ b/tccelf.c
@@ -1378,9 +1378,10 @@ int elf_output_file(TCCState *s1, const char *filename)
             build_got(s1);
 
             /* scan for undefined symbols and see if they are in the
-               dynamic symbols. If a symbol STT_FUNC is found, then we
-               add it in the PLT. If a symbol STT_OBJECT is found, we
-               add it in the .bss section with a suitable relocation */
+               dynamic symbols. If a symbol STT_FUNC or STT_GNU_IFUNC
+               is found, then we add it in the PLT. If a symbol
+               STT_OBJECT is found, we add it in the .bss section with
+               a suitable relocation */
             sym_end = (ElfW(Sym) *)(symtab_section->data + 
                                     symtab_section->data_offset);
             if (file_type == TCC_OUTPUT_EXE) {
@@ -1393,7 +1394,7 @@ int elf_output_file(TCCState *s1, const char *filename)
                         if (sym_index) {
                             esym = &((ElfW(Sym) *)s1->dynsymtab_section->data)[sym_index];
                             type = ELFW(ST_TYPE)(esym->st_info);
-                            if (type == STT_FUNC) {
+                            if ((type == STT_FUNC) || (type == STT_GNU_IFUNC)) {
                                 put_got_entry(s1, R_JMP_SLOT, esym->st_size, 
                                               esym->st_info, 
                                               sym - (ElfW(Sym) *)symtab_section->data);
@@ -1470,7 +1471,8 @@ int elf_output_file(TCCState *s1, const char *filename)
                     sym++) {
                     if (ELFW(ST_BIND)(sym->st_info) != STB_LOCAL) {
 #if defined(TCC_OUTPUT_DLL_WITH_PLT)
-                        if (ELFW(ST_TYPE)(sym->st_info) == STT_FUNC &&
+                        if ((ELFW(ST_TYPE)(sym->st_info) == STT_FUNC ||
+                            ELFW(ST_TYPE)(sym->st_info) == STT_GNU_IFUNC) &&
                             sym->st_shndx == SHN_UNDEF) {
                             put_got_entry(s1, R_JMP_SLOT, sym->st_size, 
                                           sym->st_info, 

Attachment: signature.asc
Description: This is a digitally signed message part.

_______________________________________________
Tinycc-devel mailing list
Tinycc-devel@nongnu.org
http://lists.nongnu.org/mailman/listinfo/tinycc-devel

Reply via email to