Lua 代理 DLL 三

lua-users home
wiki

以下是两个 Lua 脚本,用于为 Lua 5.1 创建代理 DLL。它们类似于您在 LuaProxyDllTwo(以及在一定程度上在 LuaProxyDll)中找到的内容。但是,它们有几个优点

第一个,*mkforwardlib.lua*,需要 Visual C++。它已在 Visual C++ 2005 Express 以及 Microsoft Platform SDK 提供的适用于 AMD64 和 IA64 平台的免费 Visual C++ 中进行了测试。如果您使用的是其他版本的 Visual C++,则需要将 link.exe 的路径放在 VCPATH 环境变量中。

第二个,*mkforwardlib-gcc.lua*,需要 GCC。它已在适用于 x86 的 MinGW 5.0.2 中进行了测试。

mkforwardlib.lua

local reallib
local fakelib
local machine
local extrasymbols = {}

local args = {...}
local errmsg
if args[1] then reallib = args[1] end
if args[2] then fakelib = args[2] end
if args[3] then machine = args[3] end
for i=4,#args do
	table.insert(extrasymbols, args[i])
end

if #args<3 then
	errmsg = "not enough parameters"
elseif not ({X86=true, AMD64=true, IA64=true})[machine] then
	errmsg = "'"..machine.."' is not a recognized machine architecture"
end
if errmsg then
	if errmsg then io.stderr:write("Error: "..errmsg.."\n") end
	io.stderr:write[[
Usage: mkforwardlib <reallib> <fakelib> <machine> [<extrasymbols>...]

    reallib         The name of the existing dll that you want to use.
    fakelib         The name of the fake dll that you want to create and that
                    will call the reallib instead.
    machine         The hardware architecture of your windows version among:
                    X86, AMD64, IA64
    extrasymbols    Additionnal symbols to export beyond standard Lua symbols
                    (if you have a very custom Lua dll).

Example: mkforwardlib lua51.dll lua5.1.dll X86
]]
	-- :TODO: add support for AM33, ARM, CEE, EBC, M32R, MIPS, MIPS16, MIPSFPU, MIPSFPU16, MIPSR41XX, SH4, SH5, THUMB
	os.exit(0)
end

local VisualC = os.getenv('VCPATH')
if not VisualC then
	if machine=='AMD64' then
		local PlatformSDK = assert(os.getenv"MSSDK", "MSSDK environment variable is not set, please set it to the path to your Platform SDK")
		VisualC = PlatformSDK.."\\Bin\\win64\\x86\\AMD64"
	elseif machine=='IA64' then
		local PlatformSDK = assert(os.getenv"MSSDK", "MSSDK environment variable is not set, please set it to the path to your Platform SDK")
		VisualC = PlatformSDK.."\\Bin\\win64"
	else
	--	local VisualCRoot = (os.getenv"PROGRAMFILES(X86)" or os.getenv"PROGRAMFILES").."\\Microsoft Visual Studio .NET 2003\\Vc7"
		local VisualCRoot = (os.getenv"PROGRAMFILES(X86)" or os.getenv"PROGRAMFILES").."\\Microsoft Visual Studio 8\\VC"
		VisualC = VisualCRoot.."\\bin"
	end
end

local symbols = {
	"luaL_addlstring",
	"luaL_addstring",
	"luaL_addvalue",
	"luaL_argerror",
	"luaL_buffinit",
	"luaL_callmeta",
	"luaL_checkany",
	"luaL_checkinteger",
	"luaL_checklstring",
	"luaL_checknumber",
	"luaL_checkoption",
	"luaL_checkstack",
	"luaL_checktype",
	"luaL_checkudata",
	"luaL_error",
	"luaL_findtable",
	"luaL_getmetafield",
	"luaL_gsub",
	"luaL_loadbuffer",
	"luaL_loadfile",
	"luaL_loadstring",
	"luaL_newmetatable",
	"luaL_newstate",
	"luaL_openlib",
	"luaL_openlibs",
	"luaL_optinteger",
	"luaL_optlstring",
	"luaL_optnumber",
	"luaL_prepbuffer",
	"luaL_pushresult",
	"luaL_ref",
	"luaL_register",
	"luaL_typerror",
	"luaL_unref",
	"luaL_where",
	"lua_atpanic",
	"lua_call",
	"lua_checkstack",
	"lua_close",
	"lua_concat",
	"lua_cpcall",
	"lua_createtable",
	"lua_dump",
	"lua_equal",
	"lua_error",
	"lua_gc",
	"lua_getallocf",
	"lua_getfenv",
	"lua_getfield",
	"lua_gethook",
	"lua_gethookcount",
	"lua_gethookmask",
	"lua_getinfo",
	"lua_getlocal",
	"lua_getmetatable",
	"lua_getstack",
	"lua_gettable",
	"lua_gettop",
	"lua_getupvalue",
	"lua_insert",
	"lua_iscfunction",
	"lua_isnumber",
	"lua_isstring",
	"lua_isuserdata",
	"lua_lessthan",
	"lua_load",
	"lua_newstate",
	"lua_newthread",
	"lua_newuserdata",
	"lua_next",
	"lua_objlen",
	"lua_pcall",
	"lua_pushboolean",
	"lua_pushcclosure",
	"lua_pushfstring",
	"lua_pushinteger",
	"lua_pushlightuserdata",
	"lua_pushlstring",
	"lua_pushnil",
	"lua_pushnumber",
	"lua_pushstring",
	"lua_pushthread",
	"lua_pushvalue",
	"lua_pushvfstring",
	"lua_rawequal",
	"lua_rawget",
	"lua_rawgeti",
	"lua_rawset",
	"lua_rawseti",
	"lua_remove",
	"lua_replace",
	"lua_resume",
	"lua_setallocf",
	"lua_setfenv",
	"lua_setfield",
	"lua_sethook",
	"lua_setlocal",
	"lua_setmetatable",
	"lua_settable",
	"lua_settop",
	"lua_setupvalue",
	"lua_status",
	"lua_toboolean",
	"lua_tocfunction",
	"lua_tointeger",
	"lua_tolstring",
	"lua_tonumber",
	"lua_topointer",
	"lua_tothread",
	"lua_touserdata",
	"lua_type",
	"lua_typename",
	"lua_xmove",
	"lua_yield",
--	"luaopen_base",
--	"luaopen_debug",
--	"luaopen_io",
--	"luaopen_math",
--	"luaopen_os",
--	"luaopen_package",
--	"luaopen_string",
--	"luaopen_table",
}

local command = {
	'"'..VisualC..'\\link.exe"',
	" -dll",
	" -nologo",
	" -noentry",
	" -machine:"..machine,
	" -incremental:no",
	" -nodefaultlib",
	" -out:"..fakelib..".dll",
	" -implib:"..fakelib..".lib",
}

for _,symbol in ipairs(symbols) do
	table.insert(command," /export:"..symbol.."="..reallib.."."..symbol)
end
for _,symbol in ipairs(extrasymbols) do
	table.insert(command," /export:"..symbol.."="..reallib.."."..symbol)
end

os.execute('"'..table.concat(command)..'"')

mkforwardlib-gcc.lua

local reallib
local fakelib
local machine
local extrasymbols = {}

local args = {...}
local errmsg
if args[1] then reallib = args[1] end
if args[2] then fakelib = args[2] end
if args[3] then machine = args[3] end
for i=4,#args do
	table.insert(extrasymbols, args[i])
end

if #args<3 then errmsg = "not enough parameters" end
if not ({X86=true})[machine] then errmsg = "'"..machine.."' is not a recognized machine architecture" end
if errmsg then
	if errmsg then io.stderr:write("Error: "..errmsg.."\n") end
	io.stderr:write[[
Usage: mkforwardlib-gcc <reallib> <fakelib> <machine> [<extrasymbols>...]

    reallib         The name of the existing dll that you want to use.
    fakelib         The name of the fake dll that you want to create and that
                    will call the reallib instead.
    machine         The hardware architecture of your windows version among:
                    X86
    extrasymbols    Additionnal symbols to export beyond standard Lua symbols
                    (if you have a very custom Lua dll).

Example: mkforwardlib lua51.dll lua5.1.dll X86
]]
	-- :TODO: add support for AMD64, IA64, AM33, ARM, CEE, EBC, M32R, MIPS, MIPS16, MIPSFPU, MIPSFPU16, MIPSR41XX, SH4, SH5, THUMB
	os.exit(0)
end

local symbols = {
	"luaL_addlstring",
	"luaL_addstring",
	"luaL_addvalue",
	"luaL_argerror",
	"luaL_buffinit",
	"luaL_callmeta",
	"luaL_checkany",
	"luaL_checkinteger",
	"luaL_checklstring",
	"luaL_checknumber",
	"luaL_checkoption",
	"luaL_checkstack",
	"luaL_checktype",
	"luaL_checkudata",
	"luaL_error",
	"luaL_findtable",
	"luaL_getmetafield",
	"luaL_gsub",
	"luaL_loadbuffer",
	"luaL_loadfile",
	"luaL_loadstring",
	"luaL_newmetatable",
	"luaL_newstate",
	"luaL_openlib",
	"luaL_openlibs",
	"luaL_optinteger",
	"luaL_optlstring",
	"luaL_optnumber",
	"luaL_prepbuffer",
	"luaL_pushresult",
	"luaL_ref",
	"luaL_register",
	"luaL_typerror",
	"luaL_unref",
	"luaL_where",
	"lua_atpanic",
	"lua_call",
	"lua_checkstack",
	"lua_close",
	"lua_concat",
	"lua_cpcall",
	"lua_createtable",
	"lua_dump",
	"lua_equal",
	"lua_error",
	"lua_gc",
	"lua_getallocf",
	"lua_getfenv",
	"lua_getfield",
	"lua_gethook",
	"lua_gethookcount",
	"lua_gethookmask",
	"lua_getinfo",
	"lua_getlocal",
	"lua_getmetatable",
	"lua_getstack",
	"lua_gettable",
	"lua_gettop",
	"lua_getupvalue",
	"lua_insert",
	"lua_iscfunction",
	"lua_isnumber",
	"lua_isstring",
	"lua_isuserdata",
	"lua_lessthan",
	"lua_load",
	"lua_newstate",
	"lua_newthread",
	"lua_newuserdata",
	"lua_next",
	"lua_objlen",
	"lua_pcall",
	"lua_pushboolean",
	"lua_pushcclosure",
	"lua_pushfstring",
	"lua_pushinteger",
	"lua_pushlightuserdata",
	"lua_pushlstring",
	"lua_pushnil",
	"lua_pushnumber",
	"lua_pushstring",
	"lua_pushthread",
	"lua_pushvalue",
	"lua_pushvfstring",
	"lua_rawequal",
	"lua_rawget",
	"lua_rawgeti",
	"lua_rawset",
	"lua_rawseti",
	"lua_remove",
	"lua_replace",
	"lua_resume",
	"lua_setallocf",
	"lua_setfenv",
	"lua_setfield",
	"lua_sethook",
	"lua_setlocal",
	"lua_setmetatable",
	"lua_settable",
	"lua_settop",
	"lua_setupvalue",
	"lua_status",
	"lua_toboolean",
	"lua_tocfunction",
	"lua_tointeger",
	"lua_tolstring",
	"lua_tonumber",
	"lua_topointer",
	"lua_tothread",
	"lua_touserdata",
	"lua_type",
	"lua_typename",
	"lua_xmove",
	"lua_yield",
--	"luaopen_base",
--	"luaopen_debug",
--	"luaopen_io",
--	"luaopen_math",
--	"luaopen_os",
--	"luaopen_package",
--	"luaopen_string",
--	"luaopen_table",
}

local def = io.open("lib"..fakelib..".def", "wb")
def:write("EXPORTS\n")
if reallib:find("%.") then
	reallib = '"'..reallib..'"'
end
for _,symbol in ipairs(symbols) do
	def:write(""..symbol.."="..reallib.."."..symbol.."\n")
end
for _,symbol in ipairs(extrasymbols) do
	def:write(""..symbol.."="..reallib.."."..symbol.."\n")
end
def:close()

os.execute('"'..table.concat({
	'gcc',
--	" -shared", -- this option seem to be incompatible with -nostartfiles
	" -o "..fakelib..".dll",
	" -nostartfiles",
	" lib"..fakelib..".def",
})..'"')

os.execute('"'..table.concat({
	'strip',
	" --strip-unneeded",
	" "..fakelib..".dll",
})..'"')
-- JeromeVuarand

这与上面的脚本相同,只是进行了一些修改以使其适用于 Lua 5.2

mkforwardlib-gcc-52.lua

local reallib
local fakelib
local machine
local extrasymbols = {}

local args = {...}
local errmsg
if args[1] then reallib = args[1] end
if args[2] then fakelib = args[2] end
if args[3] then machine = args[3] end
for i=4,#args do
	table.insert(extrasymbols, args[i])
end

if #args<3 then errmsg = "not enough parameters" end
if not ({X86=true})[machine] then errmsg = "'"..machine.."' is not a recognized machine architecture" end
if errmsg then
	if errmsg then io.stderr:write("Error: "..errmsg.."\n") end
	io.stderr:write[[
Usage: mkforwardlib-gcc <reallib> <fakelib> <machine> [<extrasymbols>...]

    reallib         The name of the existing dll that you want to use.
    fakelib         The name of the fake dll that you want to create and that
                    will call the reallib instead.
    machine         The hardware architecture of your windows version among:
                    X86
    extrasymbols    Additionnal symbols to export beyond standard Lua symbols
                    (if you have a very custom Lua dll).

Example: mkforwardlib lua52 lua5.2 X86
]]
	-- :TODO: add support for AMD64, IA64, AM33, ARM, CEE, EBC, M32R, MIPS, MIPS16, MIPSFPU, MIPSFPU16, MIPSR41XX, SH4, SH5, THUMB
	os.exit(0)
end

local symbols = {
        'luaL_addlstring',
        'luaL_addstring',
        'luaL_addvalue',
        'luaL_argerror',
        'luaL_buffinit',
        'luaL_buffinitsize',
        'luaL_callmeta',
        'luaL_checkany',
        'luaL_checkinteger',
        'luaL_checklstring',
        'luaL_checknumber',
        'luaL_checkoption',
        'luaL_checkstack',
        'luaL_checktype',
        'luaL_checkudata',
        'luaL_checkunsigned',
        'luaL_checkversion_',
        'luaL_error',
        'luaL_execresult',
        'luaL_fileresult',
        'luaL_getmetafield',
        'luaL_getsubtable',
        'luaL_gsub',
        'luaL_len',
        'luaL_loadbufferx',
        'luaL_loadfilex',
        'luaL_loadstring',
        'luaL_newmetatable',
        'luaL_newstate',
        'luaL_openlib',
        'luaL_openlibs',
        'luaL_optinteger',
        'luaL_optlstring',
        'luaL_optnumber',
        'luaL_optunsigned',
        'luaL_prepbuffsize',
        'luaL_pushmodule',
        'luaL_pushresult',
        'luaL_pushresultsize',
        'luaL_ref',
        'luaL_requiref',
        'luaL_setfuncs',
        'luaL_setmetatable',
        'luaL_testudata',
        'luaL_tolstring',
        'luaL_traceback',
        'luaL_unref',
        'luaL_where',
        'lua_absindex',
        'lua_arith',
        'lua_atpanic',
        'lua_callk',
        'lua_checkstack',
        'lua_close',
        'lua_compare',
        'lua_concat',
        'lua_copy',
        'lua_createtable',
        'lua_dump',
        'lua_error',
        'lua_gc',
        'lua_getallocf',
        'lua_getctx',
        'lua_getfield',
        'lua_getglobal',
        'lua_gethook',
        'lua_gethookcount',
        'lua_gethookmask',
        'lua_getinfo',
        'lua_getlocal',
        'lua_getmetatable',
        'lua_getstack',
        'lua_gettable',
        'lua_gettop',
        'lua_getupvalue',
        'lua_getuservalue',
        'lua_insert',
        'lua_iscfunction',
        'lua_isnumber',
        'lua_isstring',
        'lua_isuserdata',
        'lua_len',
        'lua_load',
        'lua_newstate',
        'lua_newthread',
        'lua_newuserdata',
        'lua_next',
        'lua_pcallk',
        'lua_pushboolean',
        'lua_pushcclosure',
        'lua_pushfstring',
        'lua_pushinteger',
        'lua_pushlightuserdata',
        'lua_pushlstring',
        'lua_pushnil',
        'lua_pushnumber',
        'lua_pushstring',
        'lua_pushthread',
        'lua_pushunsigned',
        'lua_pushvalue',
        'lua_pushvfstring',
        'lua_rawequal',
        'lua_rawget',
        'lua_rawgeti',
        'lua_rawgetp',
        'lua_rawlen',
        'lua_rawset',
        'lua_rawseti',
        'lua_rawsetp',
        'lua_remove',
        'lua_replace',
        'lua_resume',
        'lua_setallocf',
        'lua_setfield',
        'lua_setglobal',
        'lua_sethook',
        'lua_setlocal',
        'lua_setmetatable',
        'lua_settable',
        'lua_settop',
        'lua_setupvalue',
        'lua_setuservalue',
        'lua_status',
        'lua_toboolean',
        'lua_tocfunction',
        'lua_tointegerx',
        'lua_tolstring',
        'lua_tonumberx',
        'lua_topointer',
        'lua_tothread',
        'lua_tounsignedx',
        'lua_touserdata',
        'lua_type',
        'lua_typename',
        'lua_upvalueid',
        'lua_upvaluejoin',
        'lua_version',
        'lua_xmove',
        'lua_yieldk',
--      'luaopen_base',
--      'luaopen_bit32',
--      'luaopen_coroutine',
--      'luaopen_debug',
--      'luaopen_io',
--      'luaopen_math',
--      'luaopen_os',
--      'luaopen_package',
--      'luaopen_string',
--      'luaopen_table',
}

local def = io.open(fakelib..".def", "wb")
def:write("EXPORTS\n")
if reallib:find("%.") then
	reallib = '"'..reallib..'"'
end
for _,symbol in ipairs(symbols) do
--	def:write(""..reallib.."."..symbol.."="..reallib.."."..symbol.."\n")
	def:write(""..symbol.."="..reallib.."."..symbol.."\n")
end
for _,symbol in ipairs(extrasymbols) do
--	def:write(""..reallib.."."..symbol.."="..reallib.."."..symbol.."\n")
	def:write(""..symbol.."="..reallib.."."..symbol.."\n")
end
def:close()

os.execute('"'..table.concat({
	'gcc',
--	" -shared", -- this option seem to be incompatible with -nostartfiles
	" -o "..fakelib..".dll",
	" -nostartfiles",
	" "..fakelib..".def",
})..'"')

os.execute('"'..table.concat({
	'strip',
	" --strip-unneeded",
	" "..fakelib..".dll",
})..'"')
-- PaulKulchenko?

另请参阅


最近更改 · 偏好设置
编辑 · 历史记录
最后编辑于 2013 年 10 月 31 日下午 7:44 GMT (差异)