From mboxrd@z Thu Jan 1 00:00:00 1970 From: "H . J . Lu" To: drepper@cygnus.com, binutils@sourceware.cygnus.com, kettenis@wins.uva.nl, libc-hacker@sourceware.cygnus.com Subject: Re: libc/1818: pthread problem with dlcose() Date: Tue, 18 Jul 2000 23:51:00 -0000 Message-id: <20000718235148.A1011@lucon.org> References: <200007190007.e6J07gm14827@delius.kettenis.local> <20000718212703.A614@lucon.org> <20000719043514.1575.qmail@daffy.airs.com> X-SW-Source: 2000-07/msg00272.html On Tue, Jul 18, 2000 at 09:35:14PM -0700, Ian Lance Taylor wrote: > Date: Tue, 18 Jul 2000 21:27:03 -0700 > From: "H . J . Lu" > > > Solaris solves the problem (they also don't allow unloading the thread > > library) is by having the flag DF_1_NODELETE set in the FLAGS_1 word > > of the thread library. This is a much more worthwhile way to handle > > this. > > Here is the patch for binutils. Ian, any comments? > > Parsing a string inside BFD seems very weird to me. The linker should > handle parsing, and should tell BFD what to do. > I include "elf/common.h" in elf32.em. Is that ok? > gcc will sometimes pass -z text to the Solaris linker. I believe that > this patch will cause the linker to produce a fatal error when that > happens. Without this patch, the -z option will be ignored. I will ignore the unrecognized the -z options. > > Are these -z options compatible with existing Solaris options? That > is, has Solaris added these to the set of -z options? Or are you > making them up? If the latter, how does the Solaris linker decide > when to set these flag bits. I looked up the ld man page on Solaris 2.7. I believe my interpretation is correct. I only kept the options which say "marks the object" in the mag page. > > You need to add documentation to ld.texinfo for these new options. I > personally have no idea what they mean. > Here is the new patch. Thanks. H.J. --- 2000-07-18 H.J. Lu * bfd/elflink.h (NAME(bfd_elf,size_dynamic_sections)): Also set DF_SYMBOLIC for symbolic link. Set the DT_FLAGS and DT_FLAGS_1 entries if necessary. Index: bfd/elflink.h =================================================================== RCS file: /work/cvs/gnu/binutils/bfd/elflink.h,v retrieving revision 1.34 diff -u -p -r1.34 elflink.h --- bfd/elflink.h 2000/07/19 00:30:54 1.34 +++ bfd/elflink.h 2000/07/19 06:41:53 @@ -2837,6 +2837,7 @@ NAME(bfd_elf,size_dynamic_sections) (out { if (! elf_add_dynamic_entry (info, DT_SYMBOLIC, 0)) return false; + info->flags |= DF_SYMBOLIC; } if (rpath != NULL) @@ -3133,6 +3134,22 @@ NAME(bfd_elf,size_dynamic_sections) (out return false; elf_tdata (output_bfd)->cverdefs = cdefs; + } + + if (info->flags) + { + if (! elf_add_dynamic_entry (info, DT_FLAGS, info->flags)) + return false; + } + + if (info->flags_1) + { + if (! info->shared) + info->flags_1 &= ~ (DF_1_INITFIRST + | DF_1_NODELETE + | DF_1_NOOPEN); + if (! elf_add_dynamic_entry (info, DT_FLAGS_1, info->flags_1)) + return false; } /* Work out the size of the version reference section. */ 2000-07-18 H.J. Lu (hjl@gnu.org) * (bfd_link_info): Add flags and flags_1. Index: include/bfdlink.h =================================================================== RCS file: /work/cvs/gnu/binutils/include/bfdlink.h,v retrieving revision 1.7 diff -u -p -r1.7 bfdlink.h --- include/bfdlink.h 2000/05/18 22:10:35 1.7 +++ include/bfdlink.h 2000/07/19 03:19:57 @@ -246,6 +246,12 @@ struct bfd_link_info /* The function to call when the executable or shared object is unloaded. */ const char *fini_function; + + /* May be used to set DT_FLAGS for ELF. */ + bfd_vma flags; + + /* May be used to set DT_FLAGS_1 for ELF. */ + bfd_vma flags_1; }; /* This structures holds a set of callback functions. These are 2000-07-18 H.J. Lu * ldmain.c (main): Clear link_info.flags and link_info.flags_1. * lexsup.c (ld_options): Comment out 'z'. (parse_args): Likewise. * emultempl/elf32.em: Include "elf/common.h". (gld_${EMULATION_NAME}_parse_args): Defined. Handle some -z options. (gld_${EMULATION_NAME}_list_options): Likewise. * ld.texinfo: Add documentation for the recognized -z options. Index: ld/ld.texinfo =================================================================== RCS file: /work/cvs/gnu/binutils/ld/ld.texinfo,v retrieving revision 1.4 diff -u -p -r1.4 ld.texinfo --- ld/ld.texinfo 2000/06/20 17:47:43 1.4 +++ ld/ld.texinfo 2000/07/19 06:33:20 @@ -737,7 +737,15 @@ for Solaris compatibility. @kindex -z @var{keyword} @item -z @var{keyword} -This option is ignored for Solaris compatibility. +The recognized keywords are @var{initfirst}, @var{loadfltr}, +@var{now}, @var{nodlopen}, @var{nodelete} and @var{origin}. The other +keywords are ignored for Solaris compatibility. @var{initfirst} +marks the object to be initialized first at runtime before any other +objects. @var{loadfltr} marks the object that its filtees be processed +immediately at runtime. @var{now} marks the object with the non-lazy +runtime binding. @var{nodlopen} marks the object not available to +dlopen. @var{nodelete} marks the object shouldn't be unloaded at +runtime. @var{origin} marks the object may contain $ORIGIN. @kindex -( @cindex groups of archives Index: ld/ldmain.c =================================================================== RCS file: /work/cvs/gnu/binutils/ld/ldmain.c,v retrieving revision 1.13 diff -u -p -r1.13 ldmain.c --- ld/ldmain.c 2000/07/13 16:00:36 1.13 +++ ld/ldmain.c 2000/07/19 03:26:51 @@ -238,6 +238,8 @@ main (argc, argv) and _fini symbols. We are compatible. */ link_info.init_function = "_init"; link_info.fini_function = "_fini"; + link_info.flags = (bfd_vma) 0; + link_info.flags_1 = (bfd_vma) 0; ldfile_add_arch (""); Index: ld/lexsup.c =================================================================== RCS file: /work/cvs/gnu/binutils/ld/lexsup.c,v retrieving revision 1.17 diff -u -p -r1.17 lexsup.c --- ld/lexsup.c 2000/07/09 23:42:05 1.17 +++ ld/lexsup.c 2000/07/19 01:48:46 @@ -241,8 +241,10 @@ static const struct ld_option ld_options 'y', N_("SYMBOL"), N_("Trace mentions of SYMBOL"), TWO_DASHES }, { {NULL, required_argument, NULL, '\0'}, 'Y', N_("PATH"), N_("Default search path for Solaris compatibility"), ONE_DASH }, +#if 0 { {NULL, required_argument, NULL, '\0'}, 'z', N_("KEYWORD"), N_("Ignored for Solaris compatibility"), ONE_DASH }, +#endif { {"start-group", no_argument, NULL, '('}, '(', NULL, N_("Start a group"), TWO_DASHES }, { {"end-group", no_argument, NULL, ')'}, @@ -1015,11 +1017,13 @@ the GNU General Public License. This pr case 'y': add_ysym (optarg); break; +#if 0 case 'z': /* We accept and ignore this option for Solaris compatibility. Actually, on Solaris, optarg is not ignored. Someday we should handle it correctly. FIXME. */ break; +#endif case OPTION_SPLIT_BY_RELOC: config.split_by_reloc = strtoul (optarg, NULL, 0); break; Index: ld/emultempl/elf32.em =================================================================== RCS file: /work/cvs/gnu/binutils/ld/emultempl/elf32.em,v retrieving revision 1.18 diff -u -p -r1.18 elf32.em --- ld/emultempl/elf32.em 2000/07/19 00:15:32 1.18 +++ ld/emultempl/elf32.em 2000/07/19 06:39:26 @@ -45,6 +45,7 @@ Foundation, Inc., 59 Temple Place - Suit #include "ldfile.h" #include "ldemul.h" #include "ldgram.h" +#include "elf/common.h" static void gld${EMULATION_NAME}_before_parse PARAMS ((void)); static boolean gld${EMULATION_NAME}_open_dynamic_archive @@ -1188,20 +1189,91 @@ cat >>e${EMULATION_NAME}.c <>e${EMULATION_NAME}.c <>e${EMULATION_NAME}.c <>e${EMULATION_NAME}.c <