changeset 272:ad577f436eb7

[project @ 2003-05-24 15:46:29 by bellard] added -rdynamic support
author bellard
date Sat, 24 May 2003 15:46:29 +0000
parents 78bb1275200d
children cb72fe14a384
files tcc.c tccelf.c
diffstat 2 files changed, 19 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/tcc.c	Sat May 24 15:45:33 2003 +0000
+++ b/tcc.c	Sat May 24 15:46:29 2003 +0000
@@ -398,6 +398,9 @@
     /* if true, static linking is performed */
     int static_link;
 
+    /* if true, all symbols are exported */
+    int rdynamic;
+
     /* if true, only link in referenced objects from archive */
     int alacarte_link;
 
@@ -9653,7 +9656,7 @@
     { "shared", TCC_OPTION_shared, 0 },
     { "o", TCC_OPTION_o, TCC_OPTION_HAS_ARG },
     { "run", TCC_OPTION_run, 0 },
-    { "rdynamic", TCC_OPTION_rdynamic, 0 }, /* currently ignored */
+    { "rdynamic", TCC_OPTION_rdynamic, 0 },
     { "r", TCC_OPTION_r, 0 },
     { "W", TCC_OPTION_W, TCC_OPTION_HAS_ARG | TCC_OPTION_NOSEP },
     { "O", TCC_OPTION_O, TCC_OPTION_HAS_ARG | TCC_OPTION_NOSEP },
@@ -9838,6 +9841,9 @@
                         goto unsupported_option;
                 }
                 break;
+            case TCC_OPTION_rdynamic:
+                s->rdynamic = 1;
+                break;
             default:
                 if (s->warn_unsupported) {
                 unsupported_option:
--- a/tccelf.c	Sat May 24 15:45:33 2003 +0000
+++ b/tccelf.c	Sat May 24 15:46:29 2003 +0000
@@ -779,7 +779,7 @@
     Section *s;
 
     if (!s1->nostdlib) {
-        snprintf(buf, sizeof(buf), "%s/%s", tcc_lib_path, "libtcc1.o");
+        snprintf(buf, sizeof(buf), "%s/%s", tcc_lib_path, "libtcc1.a");
         tcc_add_file(s1, buf);
     }
 #ifdef CONFIG_TCC_BCHECK
@@ -967,7 +967,7 @@
                                 unsigned long offset;
                                 offset = bss_section->data_offset;
                                 /* XXX: which alignment ? */
-                                offset = (offset + 8 - 1) & -8;
+                                offset = (offset + 16 - 1) & -16;
                                 index = put_elf_sym(s1->dynsym, offset, esym->st_size, 
                                                     esym->st_info, 0, 
                                                     bss_section->sh_num, name);
@@ -986,6 +986,14 @@
                                 error_noabort("undefined symbol '%s'", name);
                             }
                         }
+                    } else if (s1->rdynamic && 
+                               ELF32_ST_BIND(sym->st_info) != STB_LOCAL) {
+                        /* if -rdynamic option, then export all non
+                           local symbols */
+                        name = symtab_section->link->data + sym->st_name;
+                        put_elf_sym(s1->dynsym, sym->st_value, sym->st_size, 
+                                    sym->st_info, 0, 
+                                    sym->st_shndx, name);
                     }
                 }
             
@@ -1003,6 +1011,8 @@
                         name = s1->dynsymtab_section->link->data + esym->st_name;
                         sym_index = find_elf_sym(symtab_section, name);
                         if (sym_index) {
+                            /* XXX: avoid adding a symbol if already
+                               present because of -rdynamic ? */
                             sym = &((Elf32_Sym *)symtab_section->data)[sym_index];
                             put_elf_sym(s1->dynsym, sym->st_value, sym->st_size, 
                                         sym->st_info, 0,