--
Bye bye ... Detlef

> > libcurses/libcurses.so: error: referenced dll 'libterminfo.so' not found
> > make: *** [GNUmakefile:529: libpanel/libpanel.so] Fehler 1

> > * libpanel/libpanel.so depends on libcurses/libcurses.so
> > * libcurses/libcurses.so depends on libterminfo/libterminfo.so
> > * tcc searches for libterminfo.so, but fails

>
> That happened to get into my way too at some point.
> Obviously when loading a .so library,
> tcc additionally is loads its dependencies too.

That would be correct, when the target is TCC_OUTPUT_MEMORY
but i think, in all other cases, tcc should not do that.

> It's rather early code, at tccelf.c:3653
>
>      /* load all referenced DLLs */
>      for(i = 0, dt = dynamic; i < nb_dts; i++, dt++) {
>          switch(dt->d_tag) {
>          case DT_NEEDED:
>               ...

> What's the point isn't entirely clear to me.

The point here is, that tcc tries to load all referenced libraries,
which is wrong.

> Normally if one wants to use symbols from say libterminfo too
> one could just write -lcurses -lterminfo.

"-lterminfo" is wrong, as the affected code (libpanel.so)
has no reference to "libterminfo.so" but needs only "libcurses.so".
The fact, that "libcurses.so" depends on "libterminfo.so" is an implementation 
detail.

Transformed to windows:
The Program needs kernel32.dll, but that kernel32.dll depends on ntdll.dll
is also an implementation detail.


> There may be three options:
> 1) downgrade the error to a warning,
> 2) disable loading of referenced DLLs completely,
> 3) have some switch to choose behavior
     (if such exists in gcc for example)

#1: tcc still tries to load DT_NEEDED libraries.
#3: gcc builds libpanel.so without any fancy switch

I think, "2" is the only correct fix.

I don't know the tcc callchain good enough to say,
in which codepath lands in tccelf.c:3658

Do you think, that making tccelf.c:3658 to tccelf.c:3661
depend on  is enough?

At least, that fixes the compilation break.



$ git diff tccelf.c | tee 0000_avoid_recursive_lib_loading.txt
diff --git a/tccelf.c b/tccelf.c
index 2e3d8ac..31b1b16 100644
--- a/tccelf.c
+++ b/tccelf.c
@@ -3655,9 +3655,13 @@ ST_FUNC int tcc_load_dll(TCCState *s1, int fd, const 
char *filename, int level)
             name = dynstr + dt->d_un.d_val;
             if (tcc_add_dllref(s1, name, -1))
                 continue;
-            if (tcc_add_dll(s1, name, AFF_REFERENCED_DLL) < 0) {
-                ret = tcc_error_noabort("referenced dll '%s' not found", name);
-                goto the_end;
+
+            if (s1->output_type == TCC_OUTPUT_MEMORY) {
+                /* TODO: check, when this code is reached/needed */
+                if (tcc_add_dll(s1, name, AFF_REFERENCED_DLL) < 0) {
+                    ret = tcc_error_noabort("referenced dll '%s' not found", 
name);
+                    goto the_end;
+                }
             }
         }
     }



--
Regards ... Detlef


_______________________________________________
Tinycc-devel mailing list
Tinycc-devel@nongnu.org
https://lists.nongnu.org/mailman/listinfo/tinycc-devel

Reply via email to