Articles of gcc

沙盒公开访问GCC

我想添加一个function到一个基于Linux的Web服务,允许不可信用户上传源代码到一个小的C ++程序,并将该代码自动保存到服务器上的文件,并用gcc编译,然后执行,捕获标准输出。 (这是一个与ideone.com,或者spoj.pl,或者topcoder.com,或者codechef.com或者许多其他网站完全不同的function。) 我的问题是: Q1。 我如何沙箱的可执行文件,以防止恶意用户试图破坏文件系统或访问networking等? Q2。 是否有一个公平/准确的方法来将系统资源加速处理,如处理器时间和内存使用情况?

如何用最新的GCC构build旧的源代码?

我正在尝试构buildOSKit源代码。 它是最初写在gcc 2.95.2,但在我的箱子,我得到了gcc 4.3.2。 而4.3.2不允许以下语法: asm volatile(" pushfl popl %0" : "=r" (eflags)); return eflags; 4.3.2总是抱怨说: error: missing terminating " character 有这么多的语法,有没有办法让4.3.2接受这个? 还是有更通用的方法让4.3.2像2.95.2一样? 或者我可以在哪里下载gcc的2.95.2版本? 谢谢! 更新 我真正的目标是build立OSKit 。 OSKit声称是与GCC 2.7.x或2.95.2 compilabe。 我的Ubuntu 8.10安装了GCC 4.3.2。 我尝试了以下编译序列: 4.3.2build立2.95.2 —失败 4.3.2-> 3.3.6 – > 2.7.2.3 —成功。 4.3.2 – > 2.7.2.3 —成功 3.3.6 – > 2.95.2 —失败 虽然我还没有2.95.2,但我至less得到了2.7.2.3。 但OSKit仍然与2.7.2.3 […]

pthread_create导致分段错误

我的程序包含以下代码。 pthread_t PThreadTable[32]; for (i=1; i<P; i++) // Checked with P = 4 { long i, Error; printf( "pthread_create %d!\n", i ); Error = pthread_create(&PThreadTable[i], NULL, (void * (*)(void *))(SlaveStart), NULL); if (Error != 0) { printf("Error in pthread_create().\n"); exit(-1); } } SlaveStart(); 该代码给调用pthread_create (通过gdb和valgrind检查)分段错误。 为什么这样?

rand()不返回随机值

它的一个小代码来生成一个随机厄米matrix厄密matrix 。 在每次调用rand()之前,我都调用了srand()。 但输出中仍然没有随机性。 我已经使用c99的复杂数据typesfunction来创build一个厄密matrix。 我不知道我错在哪里:( #include <stdio.h> #include <math.h> #include <complex.h> #include <stdlib.h> #include <time.h> #define MATSIZE 5 #define RAND_RANGE 100 double complex mat[MATSIZE][MATSIZE]; void gen_mat() { int i =0,j; int real; int img; for( ;i < MATSIZE; i++) { srand(time(NULL)); real = rand()%RAND_RANGE + 1; srand(time(NULL)); img = rand()%RAND_RANGE + 1; for(j = […]

使用gcc / g ++ / gdb / valgrind进行debugging时的魔术数字?

微软的Visual C ++如果没有被程序员自己初始化,就会用“幻数”填充内存。 这有助于debugging未初始化的内存。 ( 在Visual Studio C ++中,什么是内存分配表示? , 0xDEADBEEF与NULL ) 使用Linux GNU工具(g ++ / gdb)时有没有类似的function? 谢谢!

我的蹦床不会反弹(绕路,C ++,GCC)

这感觉就像我滥用我所有的问题Stackoverflow,但它是一个问答论坛毕竟:)无论如何,我已经使用了一段时间了,但我还没有实现我自己(我已经使用包装更早)。 因为我想完全控制我的代码(谁不?),我决定自己实现一个function齐全的绕行程序,所以我可以理解我的代码的每个字节。 代码(下面)尽可能简单,但问题不是。 我已经成功地实施了绕道(即我自己的function),但是我还没有能够实施蹦床 。 每当我打电话给蹦床,根据我使用的偏移量,我得到“分段错误”或“非法指令”。 尽pipe两个案件都结束了。 “核心倾销”。 我认为这是因为我混淆了“相对地址”(注:我对Linux很新,所以我远远没有掌握GDB)。 如代码中所述,取决于sizeof(jmpOp) (在第66行),我得到一个非法指令或分段错误。 我很抱歉,如果这是明显的事情,我熬夜太晚了… // Header files #include <stdio.h> #include <sys/mman.h> #include <unistd.h> #include "global.h" // Contains typedefines for byte, ulong, ushort etc… #include <cstring> bool ProtectMemory(void * addr, int flags) { // Constant holding the page size value const size_t pageSize = sysconf(_SC_PAGE_SIZE); // Calculate relative […]

ELF程序头虚拟地址和文件偏移量

我知道两者之间的关系: 虚拟地址mod页面alignment==文件偏移mod页面alignment 但有人能告诉我这两个数字在哪个方向计算吗? 根据上述关系计算文件偏移量的虚拟地址,反之亦然? 更新 这里有一些细节:当链接器写ELF文件头时,它设置程序头的虚拟地址和文件偏移量(段) 例如有readelf -l someELFfile的输出readelf -l someELFfile : Elf file type is EXEC (Executable file) Entry point 0x8048094 Program Headers: Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align LOAD 0x000000 0x08048000 0x08048000 0x00154 0x00154 RE 0x1000 LOAD 0x000154 0x08049154 0x08049154 0x00004 0x00004 RW 0x1000 GNU_STACK 0x000000 0x00000000 0x00000000 0x00000 0x00000 RW […]

(Docker)中缺lessGOMP_parallel或GOMP_4.0 jupyter / all-spark-notebook:R和Python

我有一个关于GOMP的问题,我认为与gcc有关。 我使用这个图像作为一些实验的基础。 看来我正在使用基于这个未经修改的图像的一个好的版本(4.9.2),但是我得到了一些Cython相关软件包的一些奇怪的行为。 例1 在未修改的jupyter / all-spark-notebook docker镜像上运行时,试图运行Python时出现以下问题, import lightfm Traceback (most recent call last): File "", line 1, in File "/opt/conda/lib/python3.4/site-packages/lightfm/init.py", line 1, in from .lightfm import LightFM File "/opt/conda/lib/python3.4/site-packages/lightfm/lightfm.py", line 7, in from .lightfm_fast import (CSRMatrix, FastLightFM, ImportError: /opt/conda/lib/python3.4/site-packages/lightfm/lightfm_fast.cpython-34m.so: undefined symbol: GOMP_parallel 我已经尝试过的事情: 转到文件lightfm.py并将所有依赖关系移动到一行上,如下所示: from .lightfm_fast import (CSRMatrix, FastLightFM, fit_logistic, predict_lightfm, fit_warp, fit_bpr, […]

C / C ++未使用的内联函数未定义的引用

考虑下面的代码(这不是pthread特定的;其他的例子,例如涉及实时库的那些,performance出类似的行为): #define _GNU_SOURCE #include <pthread.h> inline void foo() { static cpu_set_t cpuset; pthread_setaffinity_np(pthread_self(), sizeof(cpu_set_t), &cpuset); } int main(int argc, char *argv[]) { } 这是C和C ++中的有效程序。 所以我把这个内容保存到testc.c和testcpp.cpp并尝试构build。 当我用C++我没有遇到任何错误。 当我build立在C我得到一个未定义的引用错误。 现在,这个错误发生在-O1和-O3 。 是否有指示gcc做正确的事情(请参阅foo未使用,并跳过对pthread_setaffinity_np定义的要求)? 编辑:我认为这是显而易见的上下文,但错误信息是: /tmp/ccgARGVJ.o: In function `foo': testc.c:(.text+0x17): undefined reference to `pthread_setaffinity_np' 请注意,因为foo没有在主path中被引用,所以g++完全忽略了这个函数,但gcc却没有。 编辑2:让我再试一次。 函数foo ,以及对pthread_setaffinity_np的后续调用未使用。 主要function是空的。 只要看看它! 不知何故, g++发现foo不需要被包含,随后当我们故意省略-lpthread (并且用nm检查导出的符号确认foo和pthread_setaffinity_np都不需要引用)时,构build过程并没有发生。 gcc所得到的输出结果并不符合这个事实。 我在问这个问题,因为C ++和C前端在相同的input上似乎给出了不同的结果。 这似乎并不是一个初步问题,因为我希望这两个path都给出相同的链接错误,这就是为什么我强调这似乎是一个编译器问题。 如果C […]

在linuxterminalgcc中编程编译c代码

我在Linux上写文本到文件中的ac程序。 我遇到了麻烦,我试图使用system("gcc fileName.c")编译我创build到可执行文件的新文档。 该文件正在获得以下input: char Msg[100] = {"#include <stdio.h>\nint main();\n\nint main()\n{\n\n\treturn 0;\n}"}; 显然它有一个main()函数,但它仍然给我以下的错误墙: /usr/bin/ld: /usr/lib/debug/usr/lib/i386-linux-gnu/crt1.o(.debug_info): relocation 0 has invalid symbol index 11 /usr/bin/ld: /usr/lib/debug/usr/lib/i386-linux-gnu/crt1.o(.debug_info): relocation 1 has invalid symbol index 12 /usr/bin/ld: /usr/lib/debug/usr/lib/i386-linux-gnu/crt1.o(.debug_info): relocation 2 has invalid symbol index 2 /usr/bin/ld: /usr/lib/debug/usr/lib/i386-linux-gnu/crt1.o(.debug_info): relocation 3 has invalid symbol index 2 /usr/bin/ld: /usr/lib/debug/usr/lib/i386-linux-gnu/crt1.o(.debug_info): relocation 4 has invalid […]