编译大C文件

时间:2018-10-30 16:28:38

标签: c gcc compiler-errors mingw32

我有一个大约400M的大C文件。文件大小是由于代码本身中的大量资源所致。我正在尝试使用MinGW32进行编译,但是使用mingw32-gcc.exe -O0 -g3 -ggdb3 -o file.exe file.c进行编译,但是编译器向我显示此错误cc1.exe: out of memory allocating #N bytes。我怎么解决这个问题?

3 个答案:

答案 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出现相同的问题,我会考虑编写一个直接编写可执行文件的程序。