summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRiccardo Schirone <sirmy15@gmail.com>2021-12-15 17:30:25 +0100
committerRiccardo Schirone <sirmy15@gmail.com>2021-12-15 17:30:25 +0100
commitd88857b2102211c27adba0fe34bc19fd223d234c (patch)
tree3c973cb643dd4f36d4dbd82628e2836dfd2bbd5e
parentda11cf651576f94486dbd043dbfcde469e497574 (diff)
If the DLL has a RPATH, use it when looking for NEEDED libraries
-rw-r--r--libtcc.c14
-rw-r--r--tccelf.c2
2 files changed, 11 insertions, 5 deletions
diff --git a/libtcc.c b/libtcc.c
index b6b5f82..9534e7d 100644
--- a/libtcc.c
+++ b/libtcc.c
@@ -1134,7 +1134,7 @@ LIBTCCAPI int tcc_add_library_path(TCCState *s, const char *pathname)
}
static int tcc_add_library_internal(TCCState *s, const char *fmt,
- const char *filename, int flags, char **paths, int nb_paths)
+ const char *filename, int flags, char **paths, int nb_paths, const char *rpath)
{
char buf[1024];
int i;
@@ -1144,16 +1144,20 @@ static int tcc_add_library_internal(TCCState *s, const char *fmt,
if (tcc_add_file_internal(s, buf, flags | AFF_TYPE_BIN) == 0)
return 0;
}
+ if (rpath) {
+ snprintf(buf, sizeof(buf), fmt, rpath, filename);
+ if (tcc_add_file_internal(s, buf, flags | AFF_TYPE_BIN) == 0)
+ return 0;
+ }
return -1;
}
#ifndef TCC_TARGET_MACHO
/* find and load a dll. Return non zero if not found */
-/* XXX: add '-rpath' option support ? */
ST_FUNC int tcc_add_dll(TCCState *s, const char *filename, int flags)
{
return tcc_add_library_internal(s, "%s/%s", filename, flags,
- s->library_paths, s->nb_library_paths);
+ s->library_paths, s->nb_library_paths, s->rpath);
}
#endif
@@ -1161,7 +1165,7 @@ ST_FUNC int tcc_add_dll(TCCState *s, const char *filename, int flags)
ST_FUNC int tcc_add_crt(TCCState *s1, const char *filename)
{
if (-1 == tcc_add_library_internal(s1, "%s/%s",
- filename, 0, s1->crt_paths, s1->nb_crt_paths))
+ filename, 0, s1->crt_paths, s1->nb_crt_paths, NULL))
tcc_error_noabort("file '%s' not found", filename);
return 0;
}
@@ -1186,7 +1190,7 @@ LIBTCCAPI int tcc_add_library(TCCState *s, const char *libraryname)
int flags = s->filetype & AFF_WHOLE_ARCHIVE;
while (*pp) {
if (0 == tcc_add_library_internal(s, *pp,
- libraryname, flags, s->library_paths, s->nb_library_paths))
+ libraryname, flags, s->library_paths, s->nb_library_paths, NULL))
return 0;
++pp;
}
diff --git a/tccelf.c b/tccelf.c
index ddbce88..86d0f80 100644
--- a/tccelf.c
+++ b/tccelf.c
@@ -3487,6 +3487,8 @@ ST_FUNC int tcc_load_dll(TCCState *s1, int fd, const char *filename, int level)
for(i = 0, dt = dynamic; i < nb_dts; i++, dt++) {
if (dt->d_tag == DT_SONAME) {
soname = dynstr + dt->d_un.d_val;
+ } else if (dt->d_tag == DT_RPATH) {
+ s1->rpath = tcc_strdup(dynstr + dt->d_un.d_val);
}
}