summaryrefslogtreecommitdiff
path: root/gnu/usr.bin/binutils/ld/emultempl/elfarc.em
diff options
context:
space:
mode:
Diffstat (limited to 'gnu/usr.bin/binutils/ld/emultempl/elfarc.em')
-rw-r--r--gnu/usr.bin/binutils/ld/emultempl/elfarc.em26
1 files changed, 18 insertions, 8 deletions
diff --git a/gnu/usr.bin/binutils/ld/emultempl/elfarc.em b/gnu/usr.bin/binutils/ld/emultempl/elfarc.em
index 47dcdeba757..988bae7c339 100644
--- a/gnu/usr.bin/binutils/ld/emultempl/elfarc.em
+++ b/gnu/usr.bin/binutils/ld/emultempl/elfarc.em
@@ -76,7 +76,9 @@ gld${EMULATION_NAME}_before_parse()
/* Try to open a dynamic archive. This is where we know that ELF
dynamic libraries have an extension of .so. */
-
+/* Library not found as plain .so. Scan version numbers. Note that so.1 is
+ prefered before so.1.n because the first form is assumed to be a symlink
+ created by ldconfig to the configured version */
static char *
findshlib(arch, search, entry)
const char *arch;
@@ -87,7 +89,8 @@ findshlib(arch, search, entry)
struct dirent *dp;
char *string;
int len;
- int version = 0;
+ int version = -1;
+ int subversion = -1;
if(dd == NULL)
@@ -106,23 +109,30 @@ findshlib(arch, search, entry)
continue;
if(strncmp(string, dp->d_name, len) == 0) {
char *cp = &dp->d_name[len];
- int v = 0;
+ int v;
if(!isdigit(*cp))
continue;
v = strtol(cp, &cp, 10);
- if(*cp != 0)
- continue;
- if(v > version)
+ if(*cp == 0 && v >= version) {
+ version = v;
+ subversion = -1;
+ }
+ if(*cp++ == '.' && v > version) {
version = v;
+ subversion = strtol(cp, &cp, 10);
+ }
}
}
closedir(dd);
- if(version == 0) {
+ if(version < 0) {
free(string);
return(NULL);
}
- sprintf (string, "%s/lib%s%s.so.%d", search->name, entry->filename, arch, version);
+ if(subversion < 0)
+ sprintf (string, "%s/lib%s%s.so.%d", search->name, entry->filename, arch, version);
+ else
+ sprintf (string, "%s/lib%s%s.so.%d.%d", search->name, entry->filename, arch, version, subversion);
return(string);
}