PATCH: Add "-z muldefs" (Re: question of ld)
H . J . Lu
hjl@lucon.org
Tue May 21 20:09:00 GMT 2002
On Tue, May 21, 2002 at 03:42:11PM +0800, Shiyi Ma wrote:
> Thanks Lu, as your advice now I do the project with shared libraries.
> And another problem jump out.
> I build .so file with flag "--whole-archive" which is used to include
> every object file in the archive.(I mean I build .so with .a) And then run
> ld, there are many error and warning messages showed. These messages are
> about "multiple definition".
> I dont know how to allow multiple symbol definitions under linux. I
> just can do it under SunOS with flag "-z muldefs". Can you show me a hand
> again.
How about this patch?
H.J.
-------------- next part --------------
2002-05-21 H.J. Lu (hjl@gnu.org)
* linker.c (_bfd_generic_link_add_one_symbol): Allow multiple
definition.
2002-05-21 H.J. Lu (hjl@gnu.org)
* bfdlink.h (bfd_link_info): Add allow_multiple_definition.
2002-05-21 H.J. Lu (hjl@gnu.org)
* emultempl/elf32.em (gld${EMULATION_NAME}_parse_args): Handle
"-z muldefs".
(gld${EMULATION_NAME}_list_options): Add "-z muldefs".
* ldmain.c (main): Initialize the allow_multiple_definition
field to false.
* lexsup.c (OPTION_ALLOW_MULTIPLE_DEFINITION): New.
(ld_options): Add --allow-multiple-definition.
(parse_args): Support OPTION_ALLOW_MULTIPLE_DEFINITION.
--- binutils/bfd/linker.c.muldefs Mon May 20 11:03:04 2002
+++ binutils/bfd/linker.c Tue May 21 19:45:39 2002
@@ -1813,6 +1813,7 @@ _bfd_generic_link_add_one_symbol (info,
/* Fall through. */
case MDEF:
/* Handle a multiple definition. */
+ if (!info->allow_multiple_definition)
{
asection *msec = NULL;
bfd_vma mval = 0;
--- binutils/include/bfdlink.h.muldefs Fri Mar 8 09:48:28 2002
+++ binutils/include/bfdlink.h Tue May 21 19:39:48 2002
@@ -231,6 +231,8 @@ struct bfd_link_info
select an appropriate memset function. Apparently it is also
normal for HPPA shared libraries to have undefined symbols. */
boolean allow_shlib_undefined;
+ /* True if ok to have multiple definition. */
+ boolean allow_multiple_definition;
/* Which symbols to strip. */
enum bfd_link_strip strip;
/* Which local symbols to discard. */
--- binutils/ld/emultempl/elf32.em.muldefs Tue Apr 23 15:18:44 2002
+++ binutils/ld/emultempl/elf32.em Tue May 21 19:53:45 2002
@@ -1541,6 +1541,8 @@ cat >>e${EMULATION_NAME}.c <<EOF
}
else if (strcmp (optarg, "defs") == 0)
link_info.no_undefined = true;
+ else if (strcmp (optarg, "muldefs") == 0)
+ link_info.allow_multiple_definition = true;
else if (strcmp (optarg, "combreloc") == 0)
link_info.combreloc = true;
else if (strcmp (optarg, "nocombreloc") == 0)
@@ -1589,6 +1591,7 @@ cat >>e${EMULATION_NAME}.c <<EOF
fprintf (file, _(" -z initfirst\t\tMark DSO to be initialized first at runtime\n"));
fprintf (file, _(" -z interpose\t\tMark object to interpose all DSOs but executable\n"));
fprintf (file, _(" -z loadfltr\t\tMark object requiring immediate process\n"));
+ fprintf (file, _(" -z muldefs\t\tAllow multiple definitions\n"));
fprintf (file, _(" -z nocombreloc\tDon't merge dynamic relocs into one section\n"));
fprintf (file, _(" -z nocopyreloc\tDon't create copy relocs\n"));
fprintf (file, _(" -z nodefaultlib\tMark object not to use default search paths\n"));
--- binutils/ld/ldmain.c.muldefs Mon May 20 11:03:50 2002
+++ binutils/ld/ldmain.c Tue May 21 19:39:14 2002
@@ -239,6 +239,7 @@ main (argc, argv)
link_info.optimize = false;
link_info.no_undefined = false;
link_info.allow_shlib_undefined = false;
+ link_info.allow_multiple_definition = false;
link_info.strip = strip_none;
link_info.discard = discard_sec_merge;
link_info.keep_memory = true;
--- binutils/ld/lexsup.c.muldefs Mon May 20 11:03:50 2002
+++ binutils/ld/lexsup.c Tue May 21 19:54:17 2002
@@ -126,7 +126,8 @@ int parsing_defsym = 0;
#define OPTION_UNIQUE (OPTION_SECTION_START + 1)
#define OPTION_TARGET_HELP (OPTION_UNIQUE + 1)
#define OPTION_ALLOW_SHLIB_UNDEFINED (OPTION_TARGET_HELP + 1)
-#define OPTION_DISCARD_NONE (OPTION_ALLOW_SHLIB_UNDEFINED + 1)
+#define OPTION_ALLOW_MULTIPLE_DEFINITION (OPTION_ALLOW_SHLIB_UNDEFINED + 1)
+#define OPTION_DISCARD_NONE (OPTION_ALLOW_MULTIPLE_DEFINITION + 1)
#define OPTION_SPARE_DYNAMIC_TAGS (OPTION_DISCARD_NONE + 1)
#define OPTION_NO_DEFINE_COMMON (OPTION_SPARE_DYNAMIC_TAGS + 1)
#define OPTION_NOSTDLIB (OPTION_NO_DEFINE_COMMON + 1)
@@ -319,6 +320,8 @@ static const struct ld_option ld_options
'\0', NULL, N_("Allow no undefined symbols"), TWO_DASHES },
{ {"allow-shlib-undefined", no_argument, NULL, OPTION_ALLOW_SHLIB_UNDEFINED},
'\0', NULL, N_("Allow undefined symbols in shared objects"), TWO_DASHES },
+ { {"allow-multiple-definition", no_argument, NULL, OPTION_ALLOW_MULTIPLE_DEFINITION},
+ '\0', NULL, N_("Allow multiple definitions"), TWO_DASHES },
{ {"no-warn-mismatch", no_argument, NULL, OPTION_NO_WARN_MISMATCH},
'\0', NULL, N_("Don't warn about mismatched input files"), TWO_DASHES},
{ {"no-whole-archive", no_argument, NULL, OPTION_NO_WHOLE_ARCHIVE},
@@ -761,6 +764,9 @@ parse_args (argc, argv)
case OPTION_ALLOW_SHLIB_UNDEFINED:
link_info.allow_shlib_undefined = true;
break;
+ case OPTION_ALLOW_MULTIPLE_DEFINITION:
+ link_info.allow_multiple_definition = true;
+ break;
case OPTION_NO_WARN_MISMATCH:
command_line.warn_mismatch = false;
break;
More information about the Binutils
mailing list