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]

Re: [Patch/pe-coff] : Add native spelling of import lib names to dynamic lib search


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)


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