This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH] PE support for ELF version scripts.


    Hi all,

  Full patch, with docs and tests, as promised.

bfd/ChangeLog

	* elflink.c (find_version_for_sym):  Remove from here, ...
	* linker.c (bfd_find_version_for_sym):  ... rename, replace
	here, make public and update all callers.
	* bfd-in2.h:  Regenerate.

ld/ChangeLog

	* NEWS:  Mention new feature.
	* ld.texinfo (--version-script):  Document extent of PE support.
	(WIN32):  Mention --version-script.  Extend auto-export description.
	* pe-dll.c (process_def_file):  Use version script info to filter
	symbols from auto-export.
	* testsuite/ld-pe/vers-script-1.d:  New file.
	* testsuite/ld-pe/vers-script-2.d:  New file.
	* testsuite/ld-pe/vers-script-3.d:  New file.
	* testsuite/ld-pe/vers-script-4.d:  New file.
	* testsuite/ld-pe/vers-script-1.ver:  New file.
	* testsuite/ld-pe/vers-script-2.ver:  New file.
	* testsuite/ld-pe/vers-script-3.ver:  New file.
	* testsuite/ld-pe/vers-script-4.ver:  New file.
	* testsuite/ld-pe/vers-script-dll.c:  New file.
	* testsuite/ld-pe/vers-script.exp:  New test script.

  Retested on i686-pc-cygwin (no functional changes from the prototype), no
regressions and all new tests pass, docs tested with "make info dvi html pdf"
and visual inspection.

  Ok?

    cheers,
      DaveK
Index: bfd/elflink.c
===================================================================
RCS file: /cvs/src/src/bfd/elflink.c,v
retrieving revision 1.335
diff -p -u -r1.335 elflink.c
--- bfd/elflink.c	30 Apr 2009 15:47:10 -0000	1.335
+++ bfd/elflink.c	3 May 2009 22:14:15 -0000
@@ -1798,80 +1798,6 @@ nondefault:
   return TRUE;
 }
 
-static struct bfd_elf_version_tree *
-find_version_for_sym (struct bfd_elf_version_tree *verdefs,
-		      const char *sym_name,
-		      bfd_boolean *hide)
-{
-  struct bfd_elf_version_tree *t;
-  struct bfd_elf_version_tree *local_ver, *global_ver, *exist_ver;
-
-  local_ver = NULL;
-  global_ver = NULL;
-  exist_ver = NULL;
-  for (t = verdefs; t != NULL; t = t->next)
-    {
-      if (t->globals.list != NULL)
-	{
-	  struct bfd_elf_version_expr *d = NULL;
-
-	  while ((d = (*t->match) (&t->globals, d, sym_name)) != NULL)
-	    {
-	      global_ver = t;
-	      if (d->symver)
-		exist_ver = t;
-	      d->script = 1;
-	      /* If the match is a wildcard pattern, keep looking for
-		 a more explicit, perhaps even local, match.  */
-	      if (d->literal)
-		break;
-	    }
-
-	  if (d != NULL)
-	    break;
-	}
-
-      if (t->locals.list != NULL)
-	{
-	  struct bfd_elf_version_expr *d = NULL;
-
-	  while ((d = (*t->match) (&t->locals, d, sym_name)) != NULL)
-	    {
-	      local_ver = t;
-	      /* If the match is a wildcard pattern, keep looking for
-		 a more explicit, perhaps even global, match.  */
-	      if (d->literal)
-		{
-		  /* An exact match overrides a global wildcard.  */
-		  global_ver = NULL;
-		  break;
-		}
-	    }
-
-	  if (d != NULL)
-	    break;
-	}
-    }
-
-  if (global_ver != NULL)
-    {
-      /* If we already have a versioned symbol that matches the
-	 node for this symbol, then we don't want to create a
-	 duplicate from the unversioned symbol.  Instead hide the
-	 unversioned symbol.  */
-      *hide = exist_ver == global_ver;
-      return global_ver;
-    }
-
-  if (local_ver != NULL)
-    {
-      *hide = TRUE;
-      return local_ver;
-    }
-
-  return NULL;
-}
-
 /* This routine is used to export all defined symbols into the dynamic
    symbol table.  It is called via elf_link_hash_traverse.  */
 
@@ -1898,7 +1824,7 @@ _bfd_elf_export_symbol (struct elf_link_
       bfd_boolean hide;
 
       if (eif->verdefs == NULL
-	  || (find_version_for_sym (eif->verdefs, h->root.root.string, &hide)
+	  || (bfd_find_version_for_sym (eif->verdefs, h->root.root.string, &hide)
 	      && !hide))
 	{
 	  if (! bfd_elf_link_record_dynamic_symbol (eif->info, h))
@@ -2160,7 +2086,7 @@ _bfd_elf_link_assign_sym_version (struct
     {
       bfd_boolean hide;
 
-      h->verinfo.vertree = find_version_for_sym (sinfo->verdefs,
+      h->verinfo.vertree = bfd_find_version_for_sym (sinfo->verdefs,
 						 h->root.root.string, &hide);
       if (h->verinfo.vertree != NULL && hide)
 	(*bed->elf_backend_hide_symbol) (info, h, TRUE);
Index: bfd/linker.c
===================================================================
RCS file: /cvs/src/src/bfd/linker.c,v
retrieving revision 1.68
diff -p -u -r1.68 linker.c
--- bfd/linker.c	16 Apr 2009 23:06:59 -0000	1.68
+++ bfd/linker.c	3 May 2009 22:14:16 -0000
@@ -3245,3 +3245,95 @@ bfd_generic_define_common_symbol (bfd *o
   section->flags &= ~SEC_IS_COMMON;
   return TRUE;
 }
+
+/*
+FUNCTION
+	bfd_find_version_for_sym 
+
+SYNOPSIS
+	struct bfd_elf_version_tree * bfd_find_version_for_sym
+	  (struct bfd_elf_version_tree *verdefs,
+	   const char *sym_name, bfd_boolean *hide);
+
+DESCRIPTION
+	Search an elf version script tree for symbol versioning
+	info and export / don't-export status for a given symbol.
+	Return non-NULL on success and NULL on failure; also sets
+	the output @samp{hide} boolean parameter.
+
+*/
+
+struct bfd_elf_version_tree *
+bfd_find_version_for_sym (struct bfd_elf_version_tree *verdefs,
+		      const char *sym_name,
+		      bfd_boolean *hide)
+{
+  struct bfd_elf_version_tree *t;
+  struct bfd_elf_version_tree *local_ver, *global_ver, *exist_ver;
+
+  local_ver = NULL;
+  global_ver = NULL;
+  exist_ver = NULL;
+  for (t = verdefs; t != NULL; t = t->next)
+    {
+      if (t->globals.list != NULL)
+	{
+	  struct bfd_elf_version_expr *d = NULL;
+
+	  while ((d = (*t->match) (&t->globals, d, sym_name)) != NULL)
+	    {
+	      global_ver = t;
+	      if (d->symver)
+		exist_ver = t;
+	      d->script = 1;
+	      /* If the match is a wildcard pattern, keep looking for
+		 a more explicit, perhaps even local, match.  */
+	      if (d->literal)
+		break;
+	    }
+
+	  if (d != NULL)
+	    break;
+	}
+
+      if (t->locals.list != NULL)
+	{
+	  struct bfd_elf_version_expr *d = NULL;
+
+	  while ((d = (*t->match) (&t->locals, d, sym_name)) != NULL)
+	    {
+	      local_ver = t;
+	      /* If the match is a wildcard pattern, keep looking for
+		 a more explicit, perhaps even global, match.  */
+	      if (d->literal)
+		{
+		  /* An exact match overrides a global wildcard.  */
+		  global_ver = NULL;
+		  break;
+		}
+	    }
+
+	  if (d != NULL)
+	    break;
+	}
+    }
+
+  if (global_ver != NULL)
+    {
+      /* If we already have a versioned symbol that matches the
+	 node for this symbol, then we don't want to create a
+	 duplicate from the unversioned symbol.  Instead hide the
+	 unversioned symbol.  */
+      *hide = exist_ver == global_ver;
+      return global_ver;
+    }
+
+  if (local_ver != NULL)
+    {
+      *hide = TRUE;
+      return local_ver;
+    }
+
+  return NULL;
+}
+
Index: ld/NEWS
===================================================================
RCS file: /cvs/src/src/ld/NEWS,v
retrieving revision 1.103
diff -p -u -r1.103 NEWS
--- ld/NEWS	30 Apr 2009 15:47:03 -0000	1.103
+++ ld/NEWS	3 May 2009 22:14:16 -0000
@@ -1,5 +1,9 @@
 -*- text -*-
 
+* PE targets now add primitive support for ELF version scripts; symbols
+  are not versioned, but the local and global symbol visibility directives
+  are respected when filtering symbols in auto-export mode.
+
 * New option --no-export-dynamic to undo the effect of the -E and
   --export-dynamic options.
 
Index: ld/ld.texinfo
===================================================================
RCS file: /cvs/src/src/ld/ld.texinfo,v
retrieving revision 1.242
diff -p -u -r1.242 ld.texinfo
--- ld/ld.texinfo	29 Apr 2009 17:24:26 -0000	1.242
+++ ld/ld.texinfo	3 May 2009 22:14:18 -0000
@@ -1816,8 +1816,11 @@ the linker script being used by the link
 Specify the name of a version script to the linker.  This is typically
 used when creating shared libraries to specify additional information
 about the version hierarchy for the library being created.  This option
-is only meaningful on ELF platforms which support shared libraries.
-@xref{VERSION}.
+is only fully supported on ELF platforms which support shared libraries;
+see @ref{VERSION}.  It is partially supported on PE platforms, which can
+use version scripts to filter symbol visibility in auto-export mode: any
+symbols marked @samp{local} in the version script will not be exported.
+@xref{WIN32}.
 
 @kindex --warn-common
 @cindex warnings, on combining symbols
@@ -6582,9 +6585,19 @@ which is controlled by the following com
 @item --exclude-symbols
 @item --exclude-libs
 @item --exclude-modules-for-implib
+@item --version-script
 @end itemize
 
-If, however, @samp{--export-all-symbols} is not given explicitly on the
+When auto-export is in operation, @command{ld} will export all the non-local
+(global and common) symbols it finds in a DLL, with the exception of a few
+symbols known to belong to the system's runtime and libraries.  As it will
+often not be desirable to export all of a DLL's symbols, which may include
+private functions that are not part of any public interface, the command-line
+options listed above may be used to filter symbols out from the list for 
+exporting.  The @samp{--output-def} option can be used in order to see the
+final list of exported symbols with all exclusions taken into effect.
+
+If @samp{--export-all-symbols} is not given explicitly on the
 command line, then the default auto-export behavior will be @emph{disabled}
 if either of the following are true:
 
Index: ld/pe-dll.c
===================================================================
RCS file: /cvs/src/src/ld/pe-dll.c,v
retrieving revision 1.117
diff -p -u -r1.117 pe-dll.c
--- ld/pe-dll.c	18 Feb 2009 18:23:07 -0000	1.117
+++ ld/pe-dll.c	3 May 2009 22:14:18 -0000
@@ -670,9 +670,18 @@ process_def_file (bfd *abfd ATTRIBUTE_UN
 	      /* We should export symbols which are either global or not
 		 anything at all.  (.bss data is the latter)
 		 We should not export undefined symbols.  */
-	      if (symbols[j]->section != &bfd_und_section
-		  && ((symbols[j]->flags & BSF_GLOBAL)
-		      || (symbols[j]->flags == 0)))
+	      bfd_boolean would_export = symbols[j]->section != &bfd_und_section
+		      && ((symbols[j]->flags & BSF_GLOBAL)
+			  || (symbols[j]->flags == 0));
+	      if (lang_elf_version_info && would_export)
+		{
+		  bfd_boolean hide = 0;
+		  char ofs = pe_details->underscored && symbols[j]->name[0] == '_';
+		  (void) bfd_find_version_for_sym (lang_elf_version_info,
+				symbols[j]->name + ofs, &hide);
+		  would_export = !hide;
+		}
+	      if (would_export)
 		{
 		  const char *sn = symbols[j]->name;
 
Index: ld/testsuite/ld-pe/vers-script-1.d
===================================================================
RCS file: ld/testsuite/ld-pe/vers-script-1.d
diff -N ld/testsuite/ld-pe/vers-script-1.d
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ ld/testsuite/ld-pe/vers-script-1.d	3 May 2009 22:14:18 -0000
@@ -0,0 +1,153 @@
+EXPORTS
+    A @1
+    B @2
+    C @3
+    D @4
+    E @5
+    GC_abort @6
+    GC_add_ext_descriptor @7
+    GC_add_leaked @8
+    GC_add_map_entry @9
+    GC_used_heap_size_after_full @10
+    GC_version @11
+    GC_with_callee_saves_pushed @12
+    GC_words_allocd_at_reset @13
+    GC_world_stopped @14
+    GC_write @15
+    JIS0208_to_Unicode @16
+    JIS0212_to_Unicode @17
+    JvConvertArgv @18
+    JvRunMain @19
+    JvRunMainName @20
+    Unicode_to_JIS @21
+    _Jv_AllocBytes @22
+    _Jv_AllocObject @23
+    _Jv_AllocObjectNoFinalizer @24
+    _Jv_JNIFunctions @25
+    _Jv_JNI_InvokeFunctions @26
+    _Jv_JNI_PopSystemFrame @27
+    _Jv_JVMPI_Notify_OBJECT_ALLOC @28
+    _Jv_JVMPI_Notify_THREAD_END @29
+    _Jv_JVMPI_Notify_THREAD_START @30
+    _Jv_JVMTI_Interface @31
+    _Jv_LookupInterfaceMethod @32
+    _Jv_LookupInterfaceMethodIdx @33
+    _Jv_LookupJNIMethod @34
+    _Jv_Malloc @35
+    _Jv_Throw @36
+    _Jv_ThrowAbstractMethodError @37
+    _Jv_UnwrapJNIweakReference @38
+    _Jv__mcmp @39
+    _Jv__mdiff @40
+    _Jv__mprec_bigtens @41
+    _Jv__mprec_tinytens @42
+    _Jv_argc @43
+    _Jv_argv @44
+    _Jv_b2d @45
+    _Jv_booleanClass @46
+    _Jv_byteClass @47
+    _Jv_charClass @48
+    _Jv_d2b @49
+    _Jv_ulp @50
+    _Jv_voidClass @51
+    _Z10_Jv_InitGCv @52
+    _Z10_Jv_equalnP13_Jv_Utf8ConstPN4java4lang6StringEi @53
+    _Z11_Jv_SetArgsiPPKc @54
+    _Z11_Jv_ZMallocPvjj @55
+    _Z11trie_lookupPtt @56
+    _Z12_Jv_CondWaitP23_Jv_ConditionVariable_tP11_Jv_Mutex_txi @57
+    _Z12_Jv_init_cifP13_Jv_Utf8ConstibP7ffi_cifPP9_ffi_typeS5_ @58
+    _Z12_Jv_is_proxyPv @59
+    _Z12shsTransformP8SHS_INFO @60
+    _Z13_Jv_DisableGCv @61
+    _Z15_Jv_create_coreP14_Jv_core_chainPN4java4lang6StringE @62
+    _Z16_Jv_BlockSigchldv @63
+    _Z16_Jv_BuildGCDescrPN4java4lang5ClassE @64
+    _Z16_Jv_GCFreeMemoryv @65
+    _Z16_Jv_SetStackSizePKc @66
+    _Z16_Jv_VerifyMethodP16_Jv_InterpMethod @67
+    _Z17JvNewStringLatin1PKc @68
+    _Z24_Jv_isPrimitiveOrDerivedPK13_Jv_Utf8Const @69
+    _Z26_Jv_FindSymbolInExecutablePKc @70
+    _Z26_Jv_GCInitializeFinalizersPFvvE @71
+    _Z37_Jv_FindClassFromSignatureNoExceptionPcPN4java4lang11ClassLoaderEPS_ @72
+    _Z39_Jv_ThrowNoClassDefFoundErrorTrampolineP7ffi_cifPvPS1_S1_ @73
+    _Z7in_hashPN4java4lang6ObjectE @74
+    _Z7shsInitP8SHS_INFO @75
+    _Z8shsFinalP8SHS_INFO @76
+    _Z9_Jv_AbortPKcS0_iS0_ @77
+    _Z9_Jv_RunGCv @78
+    _Z9_Jv_ZFreePvS_ @79
+    _Z9_Jv_equalP13_Jv_Utf8ConstPN4java4lang6StringEi @80
+    _Z9shsUpdateP8SHS_INFOPhi @81
+    _ZGr30_java\$Sutil\$Sweeks\$_properties @82
+    _ZGr32_java\$Sutil\$Siso4217\$_properties @83
+    _ZGr48_gnu\$Sjavax\$Sprint\$SPrinterDialog_de\$_properties @84
+    _ZGr49_gnu\$Sjava\$Slocale\$SLocaleInformation\$_properties @85
+    _ZGr51_gnu\$Sjava\$Sutil\$Sregex\$SMessagesBundle\$_properties @86
+    _ZTVN5javax8security4auth4x50021X500PrivateCredentialE @87
+    _ZTVN5javax8security4auth5login12LoginContextE @88
+    _ZTVN5javax8security4auth5login13ConfigurationE @89
+    _ZTVN5javax8security4auth5login14LoginExceptionE @90
+    _ZTVN5javax8security4sasl19RealmChoiceCallbackE @91
+    _ZTVN5javax8security4sasl23AuthenticationExceptionE @92
+    _ZTVN5javax8security4sasl4SaslE @93
+    __gcj_personality_v0 @94
+    __ieee754_acos @95
+    __ieee754_asin @96
+    __ieee754_atan2 @97
+    __kernel_cos @98
+    __kernel_rem_pio2 @99
+    __kernel_sin @100
+    __kernel_tan @101
+    _dist_code @102
+    _length_code @103
+    _mprec_log10 @104
+    _tr_align @105
+    _tr_flush_block @106
+    _tr_init @107
+    _tr_stored_block @108
+    _tr_tally @109
+    adler32 @110
+    adler32_combine @111
+    crc32 @112
+    crc32_combine @113
+    deflate @114
+    deflateBound @115
+    deflateCopy @116
+    ffi_call_STDCALL @117
+    ffi_call_SYSV @118
+    ffi_closure_SYSV @119
+    ffi_closure_SYSV_inner @120
+    ffi_closure_alloc @121
+    ffi_closure_free @122
+    free_list_index_of @123
+    get_crc_table @124
+    gzclearerr @125
+    gzclose @126
+    gzungetc @127
+    gzwrite @128
+    h0 @129
+    h1 @130
+    h2 @131
+    h3 @132
+    h4 @133
+    inflate @134
+    inflateBack @135
+    inflateBackEnd @136
+    inflate_fast @137
+    inflate_table @138
+    lt_dladderror @139
+    lt_dladdsearchdir @140
+    lt_dlsetsearchpath @141
+    lt_dlsym @142
+    lt_preloaded_symbols @143
+    print @144
+    thread_table @145
+    uncompress @146
+    zError @147
+    z_errmsg @148
+    zcalloc @149
+    zcfree @150
+    zlibCompileFlags @151
+    zlibVersion @152
Index: ld/testsuite/ld-pe/vers-script-1.ver
===================================================================
RCS file: ld/testsuite/ld-pe/vers-script-1.ver
diff -N ld/testsuite/ld-pe/vers-script-1.ver
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ ld/testsuite/ld-pe/vers-script-1.ver	3 May 2009 22:14:18 -0000
@@ -0,0 +1,5 @@
+# Anonymous GNU ld version script to export everything.
+
+{
+  global: *;
+};
Index: ld/testsuite/ld-pe/vers-script-2.d
===================================================================
RCS file: ld/testsuite/ld-pe/vers-script-2.d
diff -N ld/testsuite/ld-pe/vers-script-2.d
Index: ld/testsuite/ld-pe/vers-script-2.ver
===================================================================
RCS file: ld/testsuite/ld-pe/vers-script-2.ver
diff -N ld/testsuite/ld-pe/vers-script-2.ver
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ ld/testsuite/ld-pe/vers-script-2.ver	3 May 2009 22:14:18 -0000
@@ -0,0 +1,5 @@
+# Anonymous GNU ld version script to export nothing.
+
+{
+  local: *;
+};
Index: ld/testsuite/ld-pe/vers-script-3.d
===================================================================
RCS file: ld/testsuite/ld-pe/vers-script-3.d
diff -N ld/testsuite/ld-pe/vers-script-3.d
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ ld/testsuite/ld-pe/vers-script-3.d	3 May 2009 22:14:18 -0000
@@ -0,0 +1,77 @@
+EXPORTS
+    JvConvertArgv @1
+    JvRunMain @2
+    JvRunMainName @3
+    _Jv_AllocBytes @4
+    _Jv_AllocObject @5
+    _Jv_AllocObjectNoFinalizer @6
+    _Jv_JNIFunctions @7
+    _Jv_JNI_InvokeFunctions @8
+    _Jv_JNI_PopSystemFrame @9
+    _Jv_JVMPI_Notify_OBJECT_ALLOC @10
+    _Jv_JVMPI_Notify_THREAD_END @11
+    _Jv_JVMPI_Notify_THREAD_START @12
+    _Jv_JVMTI_Interface @13
+    _Jv_LookupInterfaceMethod @14
+    _Jv_LookupInterfaceMethodIdx @15
+    _Jv_LookupJNIMethod @16
+    _Jv_Malloc @17
+    _Jv_Throw @18
+    _Jv_ThrowAbstractMethodError @19
+    _Jv_UnwrapJNIweakReference @20
+    _Jv__mcmp @21
+    _Jv__mdiff @22
+    _Jv__mprec_bigtens @23
+    _Jv__mprec_tinytens @24
+    _Jv_argc @25
+    _Jv_argv @26
+    _Jv_b2d @27
+    _Jv_booleanClass @28
+    _Jv_byteClass @29
+    _Jv_charClass @30
+    _Jv_d2b @31
+    _Jv_ulp @32
+    _Jv_voidClass @33
+    _Z10_Jv_InitGCv @34
+    _Z10_Jv_equalnP13_Jv_Utf8ConstPN4java4lang6StringEi @35
+    _Z11_Jv_SetArgsiPPKc @36
+    _Z11_Jv_ZMallocPvjj @37
+    _Z11trie_lookupPtt @38
+    _Z12_Jv_CondWaitP23_Jv_ConditionVariable_tP11_Jv_Mutex_txi @39
+    _Z12_Jv_init_cifP13_Jv_Utf8ConstibP7ffi_cifPP9_ffi_typeS5_ @40
+    _Z12_Jv_is_proxyPv @41
+    _Z12shsTransformP8SHS_INFO @42
+    _Z13_Jv_DisableGCv @43
+    _Z15_Jv_create_coreP14_Jv_core_chainPN4java4lang6StringE @44
+    _Z16_Jv_BlockSigchldv @45
+    _Z16_Jv_BuildGCDescrPN4java4lang5ClassE @46
+    _Z16_Jv_GCFreeMemoryv @47
+    _Z16_Jv_SetStackSizePKc @48
+    _Z16_Jv_VerifyMethodP16_Jv_InterpMethod @49
+    _Z17JvNewStringLatin1PKc @50
+    _Z24_Jv_isPrimitiveOrDerivedPK13_Jv_Utf8Const @51
+    _Z26_Jv_FindSymbolInExecutablePKc @52
+    _Z26_Jv_GCInitializeFinalizersPFvvE @53
+    _Z37_Jv_FindClassFromSignatureNoExceptionPcPN4java4lang11ClassLoaderEPS_ @54
+    _Z39_Jv_ThrowNoClassDefFoundErrorTrampolineP7ffi_cifPvPS1_S1_ @55
+    _Z7in_hashPN4java4lang6ObjectE @56
+    _Z7shsInitP8SHS_INFO @57
+    _Z8shsFinalP8SHS_INFO @58
+    _Z9_Jv_AbortPKcS0_iS0_ @59
+    _Z9_Jv_RunGCv @60
+    _Z9_Jv_ZFreePvS_ @61
+    _Z9_Jv_equalP13_Jv_Utf8ConstPN4java4lang6StringEi @62
+    _Z9shsUpdateP8SHS_INFOPhi @63
+    _ZGr30_java\$Sutil\$Sweeks\$_properties @64
+    _ZGr32_java\$Sutil\$Siso4217\$_properties @65
+    _ZGr48_gnu\$Sjavax\$Sprint\$SPrinterDialog_de\$_properties @66
+    _ZGr49_gnu\$Sjava\$Slocale\$SLocaleInformation\$_properties @67
+    _ZGr51_gnu\$Sjava\$Sutil\$Sregex\$SMessagesBundle\$_properties @68
+    _ZTVN5javax8security4auth4x50021X500PrivateCredentialE @69
+    _ZTVN5javax8security4auth5login12LoginContextE @70
+    _ZTVN5javax8security4auth5login13ConfigurationE @71
+    _ZTVN5javax8security4auth5login14LoginExceptionE @72
+    _ZTVN5javax8security4sasl19RealmChoiceCallbackE @73
+    _ZTVN5javax8security4sasl23AuthenticationExceptionE @74
+    _ZTVN5javax8security4sasl4SaslE @75
+    __gcj_personality_v0 @76
Index: ld/testsuite/ld-pe/vers-script-3.ver
===================================================================
RCS file: ld/testsuite/ld-pe/vers-script-3.ver
diff -N ld/testsuite/ld-pe/vers-script-3.ver
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ ld/testsuite/ld-pe/vers-script-3.ver	3 May 2009 22:14:18 -0000
@@ -0,0 +1,7 @@
+# Anonymous GNU ld version script to hide boehm-gc, libffi and fdlibm
+# symbols in libgcj.so.
+
+{
+  global: Jv*; _Jv_*; __gcj_personality_v0; __gcj_personality_sj0; _Z*;
+  local: *;
+};
Index: ld/testsuite/ld-pe/vers-script-4.d
===================================================================
RCS file: ld/testsuite/ld-pe/vers-script-4.d
diff -N ld/testsuite/ld-pe/vers-script-4.d
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ ld/testsuite/ld-pe/vers-script-4.d	3 May 2009 22:14:18 -0000
@@ -0,0 +1,77 @@
+EXPORTS
+    JvConvertArgv @1
+    JvRunMain @2
+    JvRunMainName @3
+    _Jv_AllocBytes @4
+    _Jv_AllocObject @5
+    _Jv_AllocObjectNoFinalizer @6
+    _Jv_JNIFunctions @7
+    _Jv_JNI_InvokeFunctions @8
+    _Jv_JNI_PopSystemFrame @9
+    _Jv_JVMPI_Notify_OBJECT_ALLOC @10
+    _Jv_JVMPI_Notify_THREAD_END @11
+    _Jv_JVMPI_Notify_THREAD_START @12
+    _Jv_JVMTI_Interface @13
+    _Jv_LookupInterfaceMethod @14
+    _Jv_LookupInterfaceMethodIdx @15
+    _Jv_LookupJNIMethod @16
+    _Jv_Malloc @17
+    _Jv_Throw @18
+    _Jv_ThrowAbstractMethodError @19
+    _Jv_UnwrapJNIweakReference @20
+    _Jv__mcmp @21
+    _Jv__mdiff @22
+    _Jv__mprec_bigtens @23
+    _Jv__mprec_tinytens @24
+    _Jv_argc @25
+    _Jv_argv @26
+    _Jv_b2d @27
+    _Jv_booleanClass @28
+    _Jv_byteClass @29
+    _Jv_charClass @30
+    _Jv_d2b @31
+    _Jv_ulp @32
+    _Jv_voidClass @33
+    _Z10_Jv_InitGCv @34
+    _Z10_Jv_equalnP13_Jv_Utf8ConstPN4java4lang6StringEi @35
+    _Z11_Jv_SetArgsiPPKc @36
+    _Z11_Jv_ZMallocPvjj @37
+    _Z11trie_lookupPtt @38
+    _Z12_Jv_CondWaitP23_Jv_ConditionVariable_tP11_Jv_Mutex_txi @39
+    _Z12_Jv_init_cifP13_Jv_Utf8ConstibP7ffi_cifPP9_ffi_typeS5_ @40
+    _Z12_Jv_is_proxyPv @41
+    _Z12shsTransformP8SHS_INFO @42
+    _Z13_Jv_DisableGCv @43
+    _Z15_Jv_create_coreP14_Jv_core_chainPN4java4lang6StringE @44
+    _Z16_Jv_BlockSigchldv @45
+    _Z16_Jv_BuildGCDescrPN4java4lang5ClassE @46
+    _Z16_Jv_GCFreeMemoryv @47
+    _Z16_Jv_SetStackSizePKc @48
+    _Z16_Jv_VerifyMethodP16_Jv_InterpMethod @49
+    _Z17JvNewStringLatin1PKc @50
+    _Z24_Jv_isPrimitiveOrDerivedPK13_Jv_Utf8Const @51
+    _Z26_Jv_FindSymbolInExecutablePKc @52
+    _Z26_Jv_GCInitializeFinalizersPFvvE @53
+    _Z37_Jv_FindClassFromSignatureNoExceptionPcPN4java4lang11ClassLoaderEPS_ @54
+    _Z39_Jv_ThrowNoClassDefFoundErrorTrampolineP7ffi_cifPvPS1_S1_ @55
+    _Z7in_hashPN4java4lang6ObjectE @56
+    _Z7shsInitP8SHS_INFO @57
+    _Z8shsFinalP8SHS_INFO @58
+    _Z9_Jv_AbortPKcS0_iS0_ @59
+    _Z9_Jv_RunGCv @60
+    _Z9_Jv_ZFreePvS_ @61
+    _Z9_Jv_equalP13_Jv_Utf8ConstPN4java4lang6StringEi @62
+    _Z9shsUpdateP8SHS_INFOPhi @63
+    _ZGr30_java\$Sutil\$Sweeks\$_properties @64
+    _ZGr32_java\$Sutil\$Siso4217\$_properties @65
+    _ZGr48_gnu\$Sjavax\$Sprint\$SPrinterDialog_de\$_properties @66
+    _ZGr49_gnu\$Sjava\$Slocale\$SLocaleInformation\$_properties @67
+    _ZGr51_gnu\$Sjava\$Sutil\$Sregex\$SMessagesBundle\$_properties @68
+    _ZTVN5javax8security4auth4x50021X500PrivateCredentialE @69
+    _ZTVN5javax8security4auth5login12LoginContextE @70
+    _ZTVN5javax8security4auth5login13ConfigurationE @71
+    _ZTVN5javax8security4auth5login14LoginExceptionE @72
+    _ZTVN5javax8security4sasl19RealmChoiceCallbackE @73
+    _ZTVN5javax8security4sasl23AuthenticationExceptionE @74
+    _ZTVN5javax8security4sasl4SaslE @75
+    __gcj_personality_v0 @76
Index: ld/testsuite/ld-pe/vers-script-4.ver
===================================================================
RCS file: ld/testsuite/ld-pe/vers-script-4.ver
diff -N ld/testsuite/ld-pe/vers-script-4.ver
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ ld/testsuite/ld-pe/vers-script-4.ver	3 May 2009 22:14:18 -0000
@@ -0,0 +1,10 @@
+# GNU ld version script to hide boehm-gc, libffi and fdlibm
+# symbols in libgcj.so.
+
+TEST_1_0 {
+  local: *;
+};
+
+TEST_1_1 {
+  global: Jv*; _Jv_*; __gcj_personality_v0; __gcj_personality_sj0; _Z*;
+};
\ No newline at end of file
Index: ld/testsuite/ld-pe/vers-script-dll.c
===================================================================
RCS file: ld/testsuite/ld-pe/vers-script-dll.c
diff -N ld/testsuite/ld-pe/vers-script-dll.c
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ ld/testsuite/ld-pe/vers-script-dll.c	3 May 2009 22:14:18 -0000
@@ -0,0 +1,156 @@
+
+#define FUNC(X_)  extern void X_ (void); void X_ (void) { };
+
+FUNC(A)
+FUNC(B)
+FUNC(C)
+FUNC(D)
+FUNC(E)
+FUNC(GC_abort)
+FUNC(GC_add_ext_descriptor)
+FUNC(GC_add_leaked)
+FUNC(GC_add_map_entry)
+FUNC(GC_used_heap_size_after_full)
+FUNC(GC_version)
+FUNC(GC_with_callee_saves_pushed)
+FUNC(GC_words_allocd_at_reset)
+FUNC(GC_world_stopped)
+FUNC(GC_write)
+FUNC(JIS0208_to_Unicode)
+FUNC(JIS0212_to_Unicode)
+FUNC(JvConvertArgv)
+FUNC(JvRunMain)
+FUNC(JvRunMainName)
+FUNC(Unicode_to_JIS)
+FUNC(_Jv_AllocBytes)
+FUNC(_Jv_AllocObject)
+FUNC(_Jv_AllocObjectNoFinalizer)
+FUNC(_ZTVN5javax8security4sasl23AuthenticationExceptionE)
+FUNC(_ZTVN5javax8security4sasl4SaslE)
+FUNC(__gcj_personality_v0)
+FUNC(__ieee754_acos)
+FUNC(__ieee754_asin)
+FUNC(__ieee754_atan2)
+FUNC(__kernel_cos)
+FUNC(__kernel_rem_pio2)
+FUNC(__kernel_sin)
+FUNC(__kernel_tan)
+FUNC(_dist_code)
+FUNC(_length_code)
+FUNC(_mprec_log10)
+FUNC(_tr_align)
+FUNC(_tr_flush_block)
+FUNC(_tr_init)
+FUNC(_tr_stored_block)
+FUNC(_tr_tally)
+FUNC(adler32)
+FUNC(adler32_combine)
+FUNC(crc32)
+FUNC(crc32_combine)
+FUNC(deflate)
+FUNC(deflateBound)
+FUNC(deflateCopy)
+FUNC(ffi_call_STDCALL)
+FUNC(ffi_call_SYSV)
+FUNC(ffi_closure_SYSV)
+FUNC(ffi_closure_SYSV_inner)
+FUNC(ffi_closure_alloc)
+FUNC(ffi_closure_free)
+FUNC(free_list_index_of)
+FUNC(get_crc_table)
+FUNC(gzclearerr)
+FUNC(gzclose)
+FUNC(gzungetc)
+FUNC(gzwrite)
+FUNC(h0)
+FUNC(h1)
+FUNC(h2)
+FUNC(h3)
+FUNC(h4)
+FUNC(inflate)
+FUNC(inflateBack)
+FUNC(inflateBackEnd)
+FUNC(inflate_fast)
+FUNC(inflate_table)
+FUNC(lt_dladderror)
+FUNC(lt_dladdsearchdir)
+FUNC(lt_dlsetsearchpath)
+FUNC(lt_dlsym)
+FUNC(lt_preloaded_symbols)
+FUNC(print)
+FUNC(thread_table)
+FUNC(uncompress)
+FUNC(zError)
+FUNC(z_errmsg)
+FUNC(zcalloc)
+FUNC(zcfree)
+FUNC(zlibCompileFlags)
+FUNC(zlibVersion)
+FUNC(_Jv_JNIFunctions)
+FUNC(_Jv_JNI_InvokeFunctions)
+FUNC(_Jv_JNI_PopSystemFrame)
+FUNC(_Jv_JVMPI_Notify_OBJECT_ALLOC)
+FUNC(_Jv_JVMPI_Notify_THREAD_END)
+FUNC(_Jv_JVMPI_Notify_THREAD_START)
+FUNC(_Jv_JVMTI_Interface)
+FUNC(_Jv_LookupInterfaceMethod)
+FUNC(_Jv_LookupInterfaceMethodIdx)
+FUNC(_Jv_LookupJNIMethod)
+FUNC(_Jv_Malloc)
+FUNC(_Jv_Throw)
+FUNC(_Jv_ThrowAbstractMethodError)
+FUNC(_Jv_UnwrapJNIweakReference)
+FUNC(_Jv__mcmp)
+FUNC(_Jv__mdiff)
+FUNC(_Jv__mprec_bigtens)
+FUNC(_Jv__mprec_tinytens)
+FUNC(_Jv_argc)
+FUNC(_Jv_argv)
+FUNC(_Jv_b2d)
+FUNC(_Jv_booleanClass)
+FUNC(_Jv_byteClass)
+FUNC(_Jv_charClass)
+FUNC(_Jv_d2b)
+FUNC(_Jv_ulp)
+FUNC(_Jv_voidClass)
+FUNC(_Z10_Jv_InitGCv)
+FUNC(_Z10_Jv_equalnP13_Jv_Utf8ConstPN4java4lang6StringEi)
+FUNC(_Z11_Jv_SetArgsiPPKc)
+FUNC(_Z11_Jv_ZMallocPvjj)
+FUNC(_Z11trie_lookupPtt)
+FUNC(_Z12_Jv_CondWaitP23_Jv_ConditionVariable_tP11_Jv_Mutex_txi)
+FUNC(_Z12_Jv_init_cifP13_Jv_Utf8ConstibP7ffi_cifPP9_ffi_typeS5_)
+FUNC(_Z12_Jv_is_proxyPv)
+FUNC(_Z12shsTransformP8SHS_INFO)
+FUNC(_Z13_Jv_DisableGCv)
+FUNC(_Z15_Jv_create_coreP14_Jv_core_chainPN4java4lang6StringE)
+FUNC(_Z16_Jv_BlockSigchldv)
+FUNC(_Z16_Jv_BuildGCDescrPN4java4lang5ClassE)
+FUNC(_Z16_Jv_GCFreeMemoryv)
+FUNC(_Z16_Jv_SetStackSizePKc)
+FUNC(_Z16_Jv_VerifyMethodP16_Jv_InterpMethod)
+FUNC(_Z17JvNewStringLatin1PKc)
+FUNC(_ZTVN5javax8security4auth4x50021X500PrivateCredentialE)
+FUNC(_ZTVN5javax8security4auth5login12LoginContextE)
+FUNC(_ZTVN5javax8security4auth5login13ConfigurationE)
+FUNC(_ZTVN5javax8security4auth5login14LoginExceptionE)
+FUNC(_ZTVN5javax8security4sasl19RealmChoiceCallbackE)
+FUNC(_Z24_Jv_isPrimitiveOrDerivedPK13_Jv_Utf8Const)
+FUNC(_Z26_Jv_FindSymbolInExecutablePKc)
+FUNC(_Z26_Jv_GCInitializeFinalizersPFvvE)
+FUNC(_Z37_Jv_FindClassFromSignatureNoExceptionPcPN4java4lang11ClassLoaderEPS_)
+FUNC(_Z39_Jv_ThrowNoClassDefFoundErrorTrampolineP7ffi_cifPvPS1_S1_)
+FUNC(_Z7in_hashPN4java4lang6ObjectE)
+FUNC(_Z7shsInitP8SHS_INFO)
+FUNC(_Z8shsFinalP8SHS_INFO)
+FUNC(_Z9_Jv_AbortPKcS0_iS0_)
+FUNC(_Z9_Jv_RunGCv)
+FUNC(_Z9_Jv_ZFreePvS_)
+FUNC(_Z9_Jv_equalP13_Jv_Utf8ConstPN4java4lang6StringEi)
+FUNC(_Z9shsUpdateP8SHS_INFOPhi)
+FUNC(_ZGr30_java$Sutil$Sweeks$_properties)
+FUNC(_ZGr32_java$Sutil$Siso4217$_properties)
+FUNC(_ZGr48_gnu$Sjavax$Sprint$SPrinterDialog_de$_properties)
+FUNC(_ZGr49_gnu$Sjava$Slocale$SLocaleInformation$_properties)
+FUNC(_ZGr51_gnu$Sjava$Sutil$Sregex$SMessagesBundle$_properties)
+
Index: ld/testsuite/ld-pe/vers-script.exp
===================================================================
RCS file: ld/testsuite/ld-pe/vers-script.exp
diff -N ld/testsuite/ld-pe/vers-script.exp
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ ld/testsuite/ld-pe/vers-script.exp	3 May 2009 22:14:18 -0000
@@ -0,0 +1,76 @@
+# Expect script for version-script driven export from dll tests
+#   Copyright 2009
+#   Free Software Foundation, Inc.
+#
+# This file is part of the GNU Binutils.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
+# MA 02110-1301, USA.
+#
+
+# This test can only be run on PE/COFF platforms.
+if {![is_pecoff_format]} {
+    return
+}
+
+# No compiler, no test.
+if { [which $CC] == 0 } {
+    untested "PE version scripts"
+    return
+}
+
+proc build_vers_script_dll_o {} {
+    global CC
+    global CFLAGS
+    global srcdir
+    global subdir
+    
+    # Compile the object file.
+    if ![ld_compile "$CC $CFLAGS -shared" $srcdir/$subdir/vers-script-dll.c tmpdir/vers-script-dll.o] {
+	fail "compiling shared lib object"
+    }
+}
+
+proc run_ver_script_test { testname } {
+    global CC
+    global srcdir
+    global subdir
+    global verbose
+
+    if ![ld_simple_link "$CC -shared \
+	    -Wl,--version-script,$srcdir/$subdir/$testname.ver \
+	    -Wl,--output-def,tmpdir/$testname.def" tmpdir/$testname.dll \
+	    "tmpdir/vers-script-dll.o"] {
+	fail "linking DLL"
+    }
+
+    if { $verbose > 2 } then { verbose "output is [file_contents tmpdir/$testname.def]" 3 }
+    if { [regexp_diff tmpdir/$testname.def $srcdir/$subdir/$testname.d] } then {
+	fail $testname
+	if { $verbose == 2 } then { verbose "output is [file_contents tmpdir/$testname.def]" 2 }
+	return
+    }
+
+    pass "$testname"
+}
+
+
+build_vers_script_dll_o
+
+run_ver_script_test "vers-script-1"
+run_ver_script_test "vers-script-2"
+run_ver_script_test "vers-script-3"
+run_ver_script_test "vers-script-4"
+

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]