문제

사용 Lua5.0 에서 Mac OS X universal 이진 응용 프로그램을 위한 몇 년 동안.Lua 스크립트를 사용하여 컴파일 luac 와 컴파일 스크립트와 함께 제공됩니다.그들이 제대로 작동하에서 호랑이와 레오파드,Intel 또는 PPC.

을 피하는 라이브러리의 문제에 시간,나는 단순히 추가 Lua src 트리를 내 Xcode 프로젝트를 컴파일로도 문제가 발생하지 않습니다.

시간이었다 업데이트하는 현대적인 버전 Lua 그래서 저는 교체되 나의 소스 트리와 그의 5.1.4.나는 재를 사용하여 luac 게 macosx (컴퓨터가 실행하는 표범에서는 Intel).

컴파일되지 않은 스크립트가 제대로 작동에 호랑이와 표범,인텔과 PPC,합니다.

그러나,지금 컴파일 스크립트를 실패로드하는 PPC 기계입니다.

그래서 저는 다시 작성 luac 으로'ansi'깃발을,그리고 다시 컴파일 스크립트.같은 오류가 있습니다.마찬가지로,빌드의 국기를'일반'제작 없이 기쁨입니다.

할 수 있는 사람을 주시기 바랍에 대한 조언을 할 수 있는 것 다음은?

도움이 되었습니까?

해결책

Lua 의 컴파일 스크립트가 꽤 많은 원시 코드로 버려진 후에 짧은 헤더가 있습니다.헤더는 문서의 일부 속성 플랫폼을 컴파일하는 데 사용되는 바이트 코드,하지만 loader 만 확인하는 현재 플랫폼 같은 속성이 있습니다.

불행하게도,이 문제에 적재할 때 바이트 코드를 컴파일하는 다른 플랫폼에서도 컴파일되면 매우 같은 버전의 Lua.물론,컴파일 스크립트에 의해 서로 다른 버전의 Lua 할 수 없는 것으로 예상 작업,그리고 이후 버전 번호의 Lua 에 포함되는 바이트코드 헤더,로드하고 그들에 의해 적발 핵심입니다.

대답은 간단하지 않은 컴파일 스크립트가 있습니다.는 경우 루아 컴파일 스크립트가 자체,당신은 단지에 대해 걱정 가능한 버전의 불일치 사 Lua 코어에서 다양한 빌드 응용 프로그램,그리고 단단하지 않습니다.

실제로 지원하는 전체 상호 호환성을 위한 컴파일된 바이트 코드는 쉽지 않은.에서는 이메일로,마이크 Pall 식별 다음과 같은 문제를 해결합니다.

  1. Endianess:왑에서 출력으로 필요합니다.

  2. sizeof(size_t), 영향,거대한 문자 상수:을 확인에 대한 오버플로우 다운그레이드.

  3. sizeof(int), 에 영향을 미칩MAXARG_BxMAXARG_sBx:을 확인에 대한 오버플로우 다운그레이드.

  4. typeof(lua_Number):에서 쉽 C 지만,호스트 및 대상 따라 동일한 FP 표준정밀 손실 업그레이드할 때(드문 경우);에 대한 경고가 아닌 정수 번호 으로 다운그레이드 int32.

모든 토론을 나는 본 적이 이 문제에 대해서 메일링 리스트,보 두 가능성이 가능한 접근,가정을 내려 그냥 배송이 컴파일되지 않은 Lua 스크립트가 있습니다.

첫 번째 것을 해결하기 위해 바이트로 컴파일 스크립트가 로드되어 있습니다.는 것으로 밝혀졌을 쉽게 당신이 기대하는 것보다,그것으로 수행할 수 있습 교체하여 낮은 수준의 기능을 읽는 스크립트 파일을 다시 컴파일하지 않고도 핵심 자체입니다.사실,그것도 할 수 있습니다 순수한 Lua,공급하여 자신 덩어리더기 기능 lua_load().이 작업해야 합으로만의 호환성 문제는 이 플랫폼은 바이트다.

두 번째는 패치는 핵심 자체가 사용하는 일반적인 표현을 위한 컴파일 스크립트에 모든 플랫폼입니다.이로 설명되었에 의해 가능 Luiz Henrique de Figueiredo:

....나는 확신이 있는 최고의 경로를 바이트로 주문 또는 크로스 컴파일은 제삼자를 덤프/undump 쌍이다.이 파 ldump.c lundump.c 완전 교체;그들은 내보내기 단,잘 정의된 엔트리 포인트이다.이 의 형식을 미리 컴파일한 덩어리가 없 신성한 모당신이 사용할 수 있습니다 어떤 형식 한 ldump.c lundump.c 에 동의 니다.(예를 들어,Rici 호수 고려 쓰는 텍스트 형식 미리 컴파일할 수 있습니다.) ....

개인적으로,내가 권하고 싶을 주는 심각한 고려사항을 미리 컴파일 스크립트이고,따라서 피 플랫폼은 휴대성이 문제다.

편집: I've 업데이트 내 설명의 바이트코드 헤더 덕분에 lhf 습니다.나가지 않고 이의 일부분 Lua 원 아직,그리고 나는 아마 확인해야기 전에 그것을 확실히 이렇게 단정적인 정보가 무엇인지에 대한 또는 이에 존재하지 않는 헤더가 있습니다.

여기에서 조각 lundump.c 는 형식의 복사본을 헤더에 일치하는 플랫폼을 실행하는 비교를 위해 바이트 코드 로드되지 않습니다.그것은 단순히 비교 memcmp() 정확히 일치하는 헤더 파일에서,그래서 모든 불일치하는 원인이 될 것이 주식 로더(luaU_undump())를 거부하는 파일입니다.

/*
* make header
*/
void luaU_header (char* h)
{
 int x=1;
 memcpy(h,LUA_SIGNATURE,sizeof(LUA_SIGNATURE)-1);
 h+=sizeof(LUA_SIGNATURE)-1;
 *h++=(char)LUAC_VERSION;
 *h++=(char)LUAC_FORMAT;
 *h++=(char)*(char*)&x;                         /* endianness */
 *h++=(char)sizeof(int);
 *h++=(char)sizeof(size_t);
 *h++=(char)sizeof(Instruction);
 *h++=(char)sizeof(lua_Number);
 *h++=(char)(((lua_Number)0.5)==0);             /* is lua_Number integral? */
}

으로 볼 수있다,헤더 12 트를 포함명(4 바이트를,"<esc>Lua"),전 및 형식으로 코드 플래그를 바이트에 대한 엔디안,크기의 유형 int, size_t, Instruction, 고 lua_Number, 와 플래그를 나타내는지 여부를 lua_Number 필수 입력.

이것은 대부분의 플랫폼을 구별하는 잡히지만,지 않을 잡으려고 하는 모든 방식 플랫폼 다를 수 있습니다.

나는 여전히 서로 추천 상기:첫째,우주선 컴파일할 수 있는 원본거나,두 번째 사용자 정의 ldump.clundump.c 를 저장하고 부하는 일반적인 형식과 함께 추가로 모든 사용자 정의 형식의를 다시 정의해야 합니다.LUAC_FORMAT 의 바이트는 이 헤더를 혼동하지 않으로 스톡 바이트코드 형식입니다.

다른 팁

다른 엔지니어를 지원하는 패치 된 바이트 코드 로더를 사용하고 싶을 수도 있습니다. 보다 이것.

나는 Rberteig의 게시물에 대해 언급했을 것이지만, 아직 그렇게 할 수있는 명성이 충분하지 않습니다. LUA 5.1.x로 LUARPC를 속도로 높이고 임베디드 대상과 함께 작동하도록 노력하면서 LDUMP.C 및 LUNDUMP.C 소스를 수정하여 좀 더 유연하게 만들었습니다. ELUA (Embedded Lua Project)에는 이미 LUA 목록에서 찾을 수있는 패치 중 일부가 있었지만 Lundump을 다른 아키텍처에서 컴파일 된 스크립트에 좀 더 친숙하게 만들기 위해 조금 더 추가했습니다. 호스트 시스템과 다른 대상을 구축 할 수 있도록 크로스 컴파일 지원이 제공됩니다 (아래 링크와 동일한 디렉토리의 luac.c 참조).

수정 사항을 확인하는 데 관심이 있으시면 ELUA 소스 저장소에서 찾을 수 있습니다.http://svn.berlios.de/wsvn/elua/trunk/src/lua/lundump.c http://svn.berlios.de/wsvn/elua/trunk/src/lua/lundump.h http://svn.berlios.de/wsvn/elua/trunk/src/lua/ldump.c

표준 면책 조항 : 수정이 완벽하거나 모든 상황에서 작동한다고 주장하지 않습니다. 당신이 그것을 사용하고 깨진 물건을 찾으면, 나는 그것을 고칠 수 있도록 그것에 대해 듣고 기뻐할 것입니다.

LUA 바이트 코드는 휴대용이 아닙니다. 응용 프로그램으로 소스 스크립트를 배송해야합니다.

다운로드 크기가 우려되는 경우 일반적으로 바이트 코드 양식보다 짧습니다.

지적 재산권이 우려되는 경우 코드 obfuscator를 사용하고 LUA 바이트 코드를 분해하는 것은 어려운 일이라는 것을 명심하십시오.

로드 시간이 우려되는 경우 설치 스크립트에서 소스를 로컬로 소환 할 수 있습니다.

나는 당신이 인텔 박스에서 스크립트를 편집했다고 추측합니다.

컴파일 된 스크립트는 크게 포괄 할 수 없습니다. 스크립트를 사전 컴파일하려면 각 컴파일 된 스크립트의 두 가지 버전 인 인텔 용 및 PPC 용으로 하나를 포함해야합니다. 앱은 실행중인 프로그램을 조사하고 올바른 컴파일 된 스크립트를 사용해야합니다.

언급 할 명성이 충분하지 않으므로 질문에 대한 적절한 답변이 아니더라도 대신 답변으로 제공해야합니다. 죄송합니다.

여기에는 Lua Obfuscator가 있습니다.

http://www.capprime.com/cppermeluaobfuscator/cppermeluaobfuscator.aspx

완전한 공개 : 나는 Obfuscator의 저자이며 그것이 완벽하지 않다는 것을 알고 있습니다. 피드백을 환영하고 권장합니다 (위 페이지에서 사용할 수있는 피드백 페이지가 있습니다).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top