我有一个大约400M的大C文件。文件大小是由于代码本身中的大量资源所致。我正在尝试使用MinGW32进行编译,但是使用mingw32-gcc.exe -O0 -g3 -ggdb3 -o file.exe file.c
进行编译,但是编译器向我显示此错误cc1.exe: out of memory allocating #N bytes
。我怎么解决这个问题?
答案 0 :(得分:0)
正如评论中提到的那样,最好的解决方案是没有大文件。
在您的特定情况下,您提到主函数仅包含数百万个nop指令(将其添加到问题btw中),我想说的解决方案是动态分配内存,然后使用循环创建nop说明。之后,使内存可执行并调用它。我发现您正在使用mingw32
,所以发现this answer描述了如何在Windows中执行此操作。
代码(从提到的答案中复制)将稍作修改,如下所示:
// Allocate some memory as readable+writable
// TODO: Check return value for error
LPVOID memPtr = VirtualAlloc(NULL, sizeof(myarr), MEM_COMMIT, PAGE_READWRITE);
// Write NOP:s
for(int i=0; i<size; i++)
memPtr[i] = // NOP code
// Change memory protection to readable+executable
// Again, TODO: Error checking
DWORD oldProtection; // Not used but required for the function
VirtualProtect(memPtr, sizeof(myarr), PAGE_EXECUTE_READ, &oldProtection);
// Assign and call the function
(void (*)()) myfunc = (void (*)()) memPtr;
myfunc();
// Free the memory
VirtualFree(memPtr, 0, MEM_RELEASE);
答案 1 :(得分:0)
假设您使用的是Windows x86(-64),则以下代码将执行4亿个nop指令:
00401000: B9 00 84 D7 17 mov ecx,17D78400h
00401005: 90 nop
00401006: E2 FD loop 00401005
00401008: 33 C0 xor eax,eax
0040100A: C3 ret
请注意,这是11个字节的代码,而不是4亿字节。
等效的C代码:
int i;
for(i = 0; i < 400000000; i++)
{
__asm__("nop;");
}
答案 2 :(得分:0)
由于您的实际问题是您需要一个巨大的可执行文件,因此解决方案与您尝试过的完全不同,这就是为什么您始终应该告诉您实际的问题是什么,而不是假设您的尝试是正确或适当的。如评论中所述,这是XY-problem
这是一个非常简单的解决方案。首先,为组装程序创建样板。在我的计算机上,使用Linux和nasm,它看起来像这样:
section .text
global _start
_start:
我将此文件命名为nop.asm
现在,我使用一个简单的bash循环添加了1000万个nop:s:
$ for i in $(seq 10000000); do echo nop >> nop.asm ; done
添加其余样板:
$ echo "mov eax,1" >> nop.asm
$ echo "int 0x80" >> nop.asm
注意:样板在您的系统上可能看起来不同
现在您将拥有一个名为nop.asm的文件,如下所示:
section .text
global _start
_start:
nop
nop
...
nop
nop
mov eax,1
int 0x80
编译并链接:
$ nasm -f elf64 nop.asm
$ ld -s -o nop nop.o
现在您有了一个很大的二进制文件:
$ ls -lh
total 94M
-rwxr-xr-x 1 klutt klutt 16M Oct 30 21:35 nop
-rw-r--r-- 1 klutt klutt 63M Oct 30 21:33 nop.asm
-rw-r--r-- 1 klutt klutt 16M Oct 30 21:34 nop.o
如果nasm与gcc出现相同的问题,我会考虑编写一个直接编写可执行文件的程序。