public inbox for binutils@sourceware.org
 help / color / mirror / Atom feed
From: Pedro Alves <pedro_alves@portugalmail.pt>
To: Binutils <binutils@sourceware.org>
Cc: Danny Smith <dannysmith@clear.net.nz>,
	  Nick Clifton <nickc@redhat.com>,
	 Christopher Faylor <me@cgf.cx>
Subject: Re: [Patch/pe-coff] : Add native spelling of import lib names to   dynamic  lib search
Date: Sat, 24 Jun 2006 17:32:00 -0000	[thread overview]
Message-ID: <449D37EB.3030407@portugalmail.pt> (raw)
In-Reply-To: <449A9F15.500@redhat.com>

Hi all,

Nick Clifton wrote:
> Hi Danny,
>
>> 2006-06-19  Danny Smith  <dannysmith@users.sourceforge.net>
>>
>>     * emultempl/pe.em (gld_${EMULATION_NAME}_open_dynamic_archive): 
>>     Restructure.  Add native "%s.lib" format to search list
>>     * ld.texinfo (node WIN32): Update documentation on dynamic lib
>>     search order. Add another reason for using import libs.   
>
> Approved and applied.
>
> Note - I slightly changed the construction of the size passed to the 
> xmalloc() function, so that instead of using sizeof on a separate 
> string, it accesses the libname_fmt structure and pulls a string out 
> of there.  I felt that this made it more obvious as to why the value 
> was being included in the computation of the amount of memory 
> required.  I also added a comment into the declaration of the 
> libname_fmt structure to remind future coders to check and update the 
> length if necessary.
This doesn't work correctly. The sizeof (libname_fmt.format) is sizeof 
(const char*), not the sizeof the string.

Fixed with the following patch. Other possibilities would be to 
s/sizeof/strlen/ or sizeof(*libname_fmt.format),
by I think this way makes the code clearer, and less surprising.

Cheers,
Pedro Alves

----

2006-06-24  Pedro Alves pedro_alves@portugalmail.pt

	PR ld/2537
	* emultempl/pe.em (gld_${EMULATION_NAME}_open_dynamic_archive): New member 
	fixed_len in libname_fmt, representing the length of the format string minus 
	the length of the formatters. Adjust xmalloc call to use the longest of the lengths.

--- pe.em.org    2006-06-24 13:18:22.000000000 +0100
+++ pe.em    2006-06-24 13:54:16.000000000 +0100
@@ -1697,52 +1697,60 @@ gld_${EMULATION_NAME}_open_dynamic_archi
   static const struct
     {
       const char * format;
+      int fixed_len;
       bfd_boolean use_prefix;
     }
   libname_fmt [] =
     {
       /* Preferred explicit import library for dll's.  */
-      { "lib%s.dll.a", FALSE },
+      { "lib%s.dll.a", 9, FALSE },
       /* Alternate explicit import library for dll's.  */
-      { "%s.dll.a", FALSE },
+      { "%s.dll.a", 6, FALSE },
       /* "libfoo.a" could be either an import lib or a static lib.
           For backwards compatibility, libfoo.a needs to precede
           libfoo.dll and foo.dll in the search.  */
-      { "lib%s.a", FALSE },
+      { "lib%s.a", 5, FALSE },
       /* The 'native' spelling of an import lib name is "foo.lib".  */ 
     
-      { "%s.lib", FALSE },
+      { "%s.lib", 4, FALSE },
 #ifdef DLL_SUPPORT
       /* Try "<prefix>foo.dll" (preferred dll name, if specified).  */
-      {    "%s%s.dll", TRUE },
+      {    "%s%s.dll", 4, TRUE },
 #endif
       /* Try "libfoo.dll" (default preferred dll name).  */
-      {    "lib%s.dll", FALSE },
+      {    "lib%s.dll", 7, FALSE },
       /* Finally try 'native' dll name "foo.dll".  */
-      {  "%s.dll", FALSE },
-      /* Note: If adding more formats to this table, make sure to check to
-     see if their length is longer than libname_fmt[0].format, and if
-     so, update the call to xmalloc() below.  */
-      { NULL, FALSE }
+      {  "%s.dll", 4, FALSE },
+      { NULL, 0, FALSE }
     };
   const char * filename;
   char * full_string;
   char * base_string;
   unsigned int i;
-
+  static int fixed_format_max_len = -1;
 
   if (! entry->is_archive)
     return FALSE;
 
+  if (fixed_format_max_len < 0)
+    {
+      fixed_format_max_len = 0;
+      for (i = 0; libname_fmt[i].format; i++)
+      {
+        if (fixed_format_max_len < libname_fmt[i].fixed_len)
+          fixed_format_max_len = libname_fmt[i].fixed_len;
+      }
+    }
+    
   filename = entry->filename;
 
   full_string = xmalloc (strlen (search->name)
              + strlen (filename)
-             /* Allow space for the characters in the format
-                string.  Also allow for the path separator that
-                is appended after the search name. We actually
-                allow 1 more byte than is strictly necessary,
-                but this will not hurt.  */
-             + sizeof libname_fmt[0].format
+             /* Allow space for the fixed characters in the format
+                string.  */
+             + fixed_format_max_len
+             /* Also allow for the path separator that
+               is appended after the search name.  */
+             + sizeof ("/") - 1
 #ifdef DLL_SUPPORT
              + (pe_dll_search_prefix
                 ? strlen (pe_dll_search_prefix) : 0)

  reply	other threads:[~2006-06-24 13:03 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2006-06-19  9:35 Danny Smith
2006-06-22 13:52 ` Nick Clifton
2006-06-24 17:32   ` Pedro Alves [this message]
2006-06-25 13:50     ` Pedro Alves
2006-06-26 12:32       ` Pedro Alves
2006-06-27 14:57         ` Nick Clifton
2006-06-20  7:39 Ross Ridge
2006-06-20  8:51 Danny Smith

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=449D37EB.3030407@portugalmail.pt \
    --to=pedro_alves@portugalmail.pt \
    --cc=binutils@sourceware.org \
    --cc=dannysmith@clear.net.nz \
    --cc=me@cgf.cx \
    --cc=nickc@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).