Skip to content

Commit 0af21b5

Browse files
committed
Avoid using fallback version when versioned symbols are found.
1 parent 2ec718e commit 0af21b5

File tree

1 file changed

+16
-3
lines changed

1 file changed

+16
-3
lines changed

tools/elfdeps.c

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
#include <sys/types.h>
44
#include <sys/stat.h>
5+
#include <sys/wait.h>
56
#include <unistd.h>
67
#include <stdlib.h>
78
#include <fcntl.h>
@@ -46,7 +47,7 @@ static char *getLibtoolVer(const char *filename)
4647
const char *so;
4748
char dest[PATH_MAX];
4849
int destsize = 0;
49-
int found_digit, found_dot = 0;
50+
int found_digit = 0, found_dot = 0;
5051

5152
destsize = readlink(filename, dest, PATH_MAX);
5253
if (destsize > 0) {
@@ -101,14 +102,15 @@ static char *getLibtoolVerFromShLink(const char *filename)
101102
void *dl_handle;
102103
struct link_map *linkmap;
103104
char *version = NULL;
105+
ssize_t len;
104106

105107
close(pipefd[0]);
106108
dl_handle = dlmopen(LM_ID_NEWLM, filename, RTLD_LAZY);
107109
if (dl_handle == NULL) _exit(0);
108110
if (dlinfo(dl_handle, RTLD_DI_LINKMAP, &linkmap) != -1) {
109111
version = getLibtoolVer(linkmap->l_name);
110112
}
111-
write(pipefd[1], version, strlen(version));
113+
len = write(pipefd[1], version, strlen(version));
112114
close(pipefd[1]);
113115
free(version);
114116
dlclose(dl_handle);
@@ -190,6 +192,14 @@ static const char *mkmarker(GElf_Ehdr *ehdr)
190192
return marker;
191193
}
192194

195+
static int findSonameInDeps(ARGV_t deps, const char *soname)
196+
{
197+
for (ARGV_t dep = deps; *dep; dep++) {
198+
if (strncmp(*dep, soname, strlen(soname)) == 0) return 1;
199+
}
200+
return 0;
201+
}
202+
193203
static void addDep(ARGV_t *deps,
194204
const char *soname, const char *ver, const char *marker,
195205
const char *compare_op, const char *fallback_ver)
@@ -326,7 +336,10 @@ static void processDynamic(Elf_Scn *scn, GElf_Shdr *shdr, elfInfo *ei)
326336
s = elf_strptr(ei->elf, shdr->sh_link, dyn->d_un.d_val);
327337
if (s) {
328338
char *libtool_ver = NULL;
329-
if (libtool_version_fallback) {
339+
// If soname matches an item already in the deps, then
340+
// it had versioned symbols and doesn't require fallback.
341+
if (libtool_version_fallback &&
342+
!findSonameInDeps(ei->requires, s)) {
330343
libtool_ver = getLibtoolVerFromShLink(s);
331344
}
332345
addDep(&ei->requires, s, NULL, ei->marker, ">=", libtool_ver);

0 commit comments

Comments
 (0)