Hi, On Wed, 13 Mar 2019, Andy Goth wrote:
> Thank you for all your help. I have succeeded in resolving the issue. As I > stated in my first email, I am using gcc to compile tcc. gcc is indeed > putting underscores at the beginning of symbol names and is using the PE > object file format. To work around this, I patched the tcc4tcl build > process to run objcopy on libtcc1.a to remove the underscores and convert > the archive members to ELF. The patch is probably not of interest to anyone > else here because it includes no changes to tcc itself. Ah, newer TCCs always compile libtcc1 with TCC itself (except if using a non-default explicit make target), so this should be specific to the old TCC version used by tcc4tcl. Cute hack^Wwork-around with objcopy :) Ciao, Michael. > > See also: http://wiki.tcl.tk/tcc4tcl > > On Wed, Mar 13, 2019, 08:33 Michael Matz <matz....@frakked.de> wrote: > > > Hi, > > > > On Tue, 12 Mar 2019, Andy Goth wrote: > > > > > So there's the big clue. The code is asking for ashldi3 with two leading > > > underscores, but the archive index contains ashldi3 with three leading > > > underscores. Thus, the archive object libtcc1.o doesn't contain the > > > requested symbol and therefore is not loaded. > > > > Well, so there's a mismatch in configuration between whatever compiled > > your libtcc1.o and your TCC used as code generator, I think it's best to > > resolve this instead of trying to make it work in presence of this > > mismatch. > > > > > I read that on 32-bit (but not 64-bit) Windows, "cdecl" function names > > > are prefixed by an underscore. (Also I see _tclStubs, which is a global > > > variable, has an underscore prefix too.) There's a fair bit of code in > > > tcc to address this, for example in pe_find_import(), but there's no > > > analogue in tcc_load_alacarte(). > > > > > > It seems odd adding PE-specific symbol mangling code to > > > tcc_load_alacarte() which lives in tccelf.c. Instead, I feel it makes > > > more sense for the PE-specific part of put_extern_sym2() to handle > > > FUNC_CDECL when can_add_underscore is true. > > > > > > This... works? Kind of? When I try it, it indeed calls > > > tcc_load_object_file() because ___ashldi3 now matches. But then it fails > > > with an "invalid object file" error, since tcc_load_object_file() chokes > > > on the object file not starting with the ELF header magic number. And it > > > makes perfect sense that it would fail, since the object file is in PE > > > format, not ELF. > > > > > > How is this expected to work? Is it wrong to put PE object files in an > > > "ar" archive? That's how the makefile does it on all platforms, so > > > clearly that's intended. > > > > TCC can only load ELF object files (and archives), also on Windows. > > (Well, it can also load the export table of Windows PE DLLs). So if you > > want to load libtcc1.a it must be produced by a compiler producing ELF > > files (on Windows it's probably easiest if it's produced by TCC). > > > > Maybe that's where your mismatch comes from? That your libtcc1.o/a is > > compiled by something else than the TCC you have? > > > > > > Ciao, > > Michael. > > > > > > > > On Tue, Mar 12, 2019, 12:50 Louis Botha <lbo...@nextivityinc.com> wrote: > > > > > > > Hi Andy, > > > > > > > > > > > > > > > > I have a Windows application that loads libtcc1-32.a or libtcc1-64.a > > > > dynamically, all I did was to call both with of these: > > > > > > > > > > > > > > > > tcc_set_lib_path > > > > > > > > tcc_add_library_path > > > > > > > > > > > > > > > > before calling tcc_compile_string (not sure if both of these are needed > > > > but that’s what I did originally). > > > > > > > > The path that I passed to those functions has a sub-folder called lib > > that > > > > contains libtcc1-32.a and libtcc1-64.a, > > > > > > > > > > > > > > > > Not sure it’s that simple in tcc4tccl but hope that helps. > > > > > > > > > > > > > > > > Best regards, > > > > > > > > Louis > > > > > > > > > > > > > > > > *From:* Tinycc-devel <tinycc-devel-bounces+lbotha= > > > > nextivityinc....@nongnu.org> *On Behalf Of *Andy Goth > > > > *Sent:* Monday, March 11, 2019 9:28 PM > > > > *To:* tinycc-devel@nongnu.org > > > > *Subject:* Re: [Tinycc-devel] Undefined symbol '__ashldi3' > > > > > > > > > > > > > > > > My application is a Tcl interpreter, so it doesn't directly link with > > > > libtcc1.a and rather tries to dynamically load it. This is working fine > > > > with 32-bit Linux but not Windows. > > > > > > > > > > > > > > > > In trying to force linking with libtcc1.a, I hit more problems. The > > main > > > > issue is that without "-Wl,-whole-archive", the linker sees no reason > > to > > > > include any part of libtcc1.a, since no part of the application uses > > it. > > > > Then when I do use "-Wl,-whole-archive", I get other link errors due to > > > > other object files in libtcc1.a that I don't care about, stuff about > > > > WinMain or whatever. Sorry, I didn't bother to take detailed notes on > > that, > > > > since I moved on to directly trying to pull in libtcc1.o and alloca86.o > > > > since that's all I think I need. But while I did get them to link by > > hand, > > > > I couldn't figure out how to mechanize the required link command > > within the > > > > framework of the Tcl application build system, so I couldn't invoke the > > > > rest of the build process needed to give the interpreter its virtual > > > > filesystem. > > > > > > > > > > > > > > > > So I'm stepping back from that to ask how it's supposed to work for my > > > > application to link to libtcc1.a rather than rely on tcc to dynamically > > > > load libtcc1.a, which is what it's doing nicely on Linux already. > > > > > > > > > > > > > > > > Granted, this libtcc1.a dynamic loading might be bolted onto tcc by the > > > > patches that come with tcc4tcl, so if anything I'm saying sounds alien > > to > > > > the design of tcc, let me know so I can bug the tcc4tcl author instead. > > > > > > > > > > > > > > > > I tried hard to use gdb to debug dynamic loading, but it's proving to > > be a > > > > nightmare in Windows. gdb is not showing me my arguments, it's > > claiming all > > > > functions are defined in some unrelated C++ header file, and I had to > > find > > > > and build debugbreak.c just to be able to Ctrl+C my process and get > > back to > > > > the gdb prompt. And stdout isn't working for me either. So I'm really > > not > > > > sure how to debug. Nevertheless, I do see that pe_add_runtime() is > > being > > > > called, which in turn tries and fails to load libtcc1.a using > > > > tcc_add_dll(). I wish I could inspect the arguments being passed to > > > > tcc_add_file_internal(), but gdb is not cooperating, despite me > > compiling > > > > everything with -ggdb3 and forgoing the strip stage of the Tcl build > > > > process. > > > > > > > > > > > > > > > > On Fri, Mar 8, 2019, 08:04 Michael Matz <matz....@frakked.de> wrote: > > > > > > > > Hi, > > > > > > > > On Fri, 8 Mar 2019, Andy Goth wrote: > > > > > > > > > On Fri, Mar 8, 2019, 00:46 Andy Goth <andrew.m.g...@gmail.com> > > wrote: > > > > > > > > > > > With tcc4tcl 0.30 (tcc 0.9.26) compiled with MXE GCC 5.4.0, I get > > the > > > > > > following error: > > > > > > > > > > > > > > > > I left out a critical detail. This is 32-bit Windows MXE GCC. I > > haven't > > > > > tried 64-bit Windows yet, but it works fine in both 32- and 64-bit > > Linux. > > > > > > > > Yes, only 32bit code emits calls to this function, on both Windows and > > > > Linux. The function is defined in either libgcc.a or libtcc1.a which > > > > TCC automatically should link against (either of them). Somehow this > > is > > > > not happening, I can't say why, you'll have to figure it out. > > > > > > > > Alternatively, if there are reasons why you don't link against > > libtcc1.a > > > > or libgcc.a you will have to provide an implementation of this function > > > > yourself, you could look into lib/libtcc1.c source for that. > > > > > > > > There are other helper functions that TCC might also generate calls for > > > > in the i386 backend: > > > > > > > > __divdi3 long ret,x,y; ret = x / y; > > > > __udivdi3 ulong ret,x,y; ret = x / y; > > > > __moddi3 long ret,x,y; ret = x % y; > > > > __umoddi3 ulong ret,x,y; ret = x % y; > > > > __ashrdi3 long ret,x,y; ret = x >> y; > > > > __lshrdi3 ulong ret,x,y; ret = x >> y; > > > > __floatundisf ulong -> float > > > > __floatundidf ulong -> double > > > > __floatundixf ulong -> long double > > > > __fixunssfdi float -> ulong > > > > __fixunsdfdi double -> ulong > > > > __fixunsxfdi long double -> ulong > > > > __fixsfdi float -> long > > > > __fixdfdi double -> long > > > > __fixxfdi long double -> long > > > > > > > > So it's probably easier to just figure out why libtcc1.a isn't linked > > > > automatically with your program. > > > > > > > > > > > > Ciao, > > > > Michael. > > > > > > > > _______________________________________________ > > > > Tinycc-devel mailing list > > > > Tinycc-devel@nongnu.org > > > > https://lists.nongnu.org/mailman/listinfo/tinycc-devel > > > > > > > > _______________________________________________ > > > > Tinycc-devel mailing list > > > > Tinycc-devel@nongnu.org > > > > https://lists.nongnu.org/mailman/listinfo/tinycc-devel > > > > > > > _______________________________________________ > > Tinycc-devel mailing list > > Tinycc-devel@nongnu.org > > https://lists.nongnu.org/mailman/listinfo/tinycc-devel > > >
_______________________________________________ Tinycc-devel mailing list Tinycc-devel@nongnu.org https://lists.nongnu.org/mailman/listinfo/tinycc-devel