lua-users home
lua-l archive

[Date Prev][Date Next][Thread Prev][Thread Next] [Date Index] [Thread Index]


Sometime on Tue, 15 Jul 2008, Shmuel Zeigerman wrote:
....
I have an app (named lua51x.exe) that is a static build of Lua 5.1 with several libraries also linked statically into this executable. So this
executable has no dependencies other than Windows system libraries
available on any modern Windows installation, therefore it always works
"out-of-the-box". However, I'd like it to be able to require()
additional Lua libraries (that are not built into it).

Although in principle possible, Windows does not support out of the box the kind of dynamic linkage required to make this use case safe. (Apparently various Unix/linux/bsd-like systems do, by noticing that the process already has a required symbol exported before attempting to dynamically load a library to define it. Windows doesn't do that.)

I suspect that someone really knowledgeable about the details of the process loader could create a glue DLL named lua51.dll that forwards back to the hosting executable, thus making it possible for a require()'d module to link to the one and only copy of the Lua core.

An interesting thing is that Lua 5.1 is almost there. If I don't
require() 'strict', then lua51x.exe runs happily test suites for all the
Lua libraries on my system. This makes me think that fixing the
dummynode_ issue is worthwhile.

As I understand things, the success of the test suite you report is by accident, not by design. The other threads on the list have talked more authoritatively about what changes would be needed in the definition of lua_State to make it more likely to work in more cases. But IMHO, that just pushes the can of worms a shelf down...

There is already a similar kind of issue involving the C runtime library. It is just as critical that every module in the process be linked to the same C runtime instance, or you can't expect that passing a FILE* around is safe. Mitigating the damage by being careful to only free() what you malloc()'d in the right runtime DLL helps, but...

For instance, what happens when the loaded module is linked against a different version of the lua core than the one statically linked into the EXE? If both the EXE and loaded DLL dynamically load and share a single copy of the Lua core DLL, then unless one or the other depended on a bug in the older version, all is almost certainly well. With a (magical) DLL that forwards back to a statically linked core, all is also well. But if you share a lua_State between copies of the core then you are trusting that all copies have identical definitions of lua_State, and that they use them compatibly. That is a pretty stiff design requirement to achieve and maintain for not a whole lot of benefit.

I would much rather see someone cleverer than I figure out how to do the magical forward to the statically linked core.

Ross Berteig                               Ross@CheshireEng.com
Cheshire Engineering Corp.           http://www.CheshireEng.com/