|
2 | 2 |
|
3 | 3 | #include <sys/types.h> |
4 | 4 | #include <sys/stat.h> |
| 5 | +#include <sys/wait.h> |
5 | 6 | #include <unistd.h> |
6 | 7 | #include <stdlib.h> |
7 | 8 | #include <fcntl.h> |
@@ -46,7 +47,7 @@ static char *getLibtoolVer(const char *filename) |
46 | 47 | const char *so; |
47 | 48 | char dest[PATH_MAX]; |
48 | 49 | int destsize = 0; |
49 | | - int found_digit, found_dot = 0; |
| 50 | + int found_digit = 0, found_dot = 0; |
50 | 51 |
|
51 | 52 | destsize = readlink(filename, dest, PATH_MAX); |
52 | 53 | if (destsize > 0) { |
@@ -101,14 +102,15 @@ static char *getLibtoolVerFromShLink(const char *filename) |
101 | 102 | void *dl_handle; |
102 | 103 | struct link_map *linkmap; |
103 | 104 | char *version = NULL; |
| 105 | + ssize_t len; |
104 | 106 |
|
105 | 107 | close(pipefd[0]); |
106 | 108 | dl_handle = dlmopen(LM_ID_NEWLM, filename, RTLD_LAZY); |
107 | 109 | if (dl_handle == NULL) _exit(0); |
108 | 110 | if (dlinfo(dl_handle, RTLD_DI_LINKMAP, &linkmap) != -1) { |
109 | 111 | version = getLibtoolVer(linkmap->l_name); |
110 | 112 | } |
111 | | - write(pipefd[1], version, strlen(version)); |
| 113 | + len = write(pipefd[1], version, strlen(version)); |
112 | 114 | close(pipefd[1]); |
113 | 115 | free(version); |
114 | 116 | dlclose(dl_handle); |
@@ -190,6 +192,14 @@ static const char *mkmarker(GElf_Ehdr *ehdr) |
190 | 192 | return marker; |
191 | 193 | } |
192 | 194 |
|
| 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 | + |
193 | 203 | static void addDep(ARGV_t *deps, |
194 | 204 | const char *soname, const char *ver, const char *marker, |
195 | 205 | const char *compare_op, const char *fallback_ver) |
@@ -326,7 +336,10 @@ static void processDynamic(Elf_Scn *scn, GElf_Shdr *shdr, elfInfo *ei) |
326 | 336 | s = elf_strptr(ei->elf, shdr->sh_link, dyn->d_un.d_val); |
327 | 337 | if (s) { |
328 | 338 | 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)) { |
330 | 343 | libtool_ver = getLibtoolVerFromShLink(s); |
331 | 344 | } |
332 | 345 | addDep(&ei->requires, s, NULL, ei->marker, ">=", libtool_ver); |
|
0 commit comments