Articles of gcc

传统的gcc编译器问题

我们正在使用一个基于gcc 2.6.0的遗留编译器来交叉编译我们现在仍在使用的旧embedded式处理器(是的,它自1994年起仍在使用!)。 为这个芯片做了gcc端口的工程师早就开始工作了。 尽pipe我们可以从网上的某个地方恢复gcc 2.6.0源码,但是这个芯片的设置已经在公司历史的大厅里消失了。 直到最近,由于编译器仍在运行并生成可用的可执行文件,所以直到最近,我们一直在困惑,但是从2.6.25内核(也是2.6.26)开始,它会失败并显示消息gcc: virtual memory exhausted …即使不带参数运行或只有-v 。 我已经使用2.6.24内核重启了我的开发系统(从2.6.26开始),编译器再次运行(2.6.25不重启)。 我们有一个系统,我们在2.6.24中只是为了构build这个芯片而做的,但是当linux世界移动到我们不能再重build一个将运行的系统编译器(即我们的2.6.24系统死机,我们不能得到2.6.24安装和运行在一个新的系统,因为一些软件部分不再可用)。 有没有人有任何想法,我们可以做一个更现代化的安装,让这个遗留的编译器运行? 编辑 : 回答一些评论… 不幸的是,这是我们的芯片特有的源代码更改丢失。 这个损失发生在两个主要的公司reorgs和几个系统pipe理员(其中几个真的留下了一个烂摊子)。 我们现在使用configuration控制,但是对于这个问题,closures仓库门太晚了。 虚拟机的使用是一个好主意,也可能是我们最终做的事情。 谢谢你的想法。 最后,我试着用ephemientbuild议strace,发现最后一个系统调用是brk(),它在新系统(2.6.26内核)上返回一个错误,并在旧系统(2.6.24内核)上返回成功。 这表明我真的用完了虚拟内存,除了tcsh“limit”在旧系统和新系统上返回相同的值,而/ proc / meminfo显示新系统的内存稍微多一些,交换空间也多了一点。 也许这是一个碎片问题或程序正在加载? 我做了一些进一步的研究,并在内核2.6.25中添加了“brk随机化”,但CONFIG_COMPAT_BRK默认启用(禁用brk随机化)。 编辑 : OK,更多信息:看起来像brk随机化是罪魁祸首,遗留gcc调用brk()来更改数据段的结尾,现在失败,导致遗留gcc报告“虚拟内存已耗尽”。 有几个logging的方法来禁用brk随机化: sudo echo 0 > /proc/sys/kernel/randomize_va_space sudo sysctl -w kernel.randomize_va_space=0 用setarch i386 -R tcsh (或“-R -L”)启动一个新的shell 我已经尝试过,他们似乎有一个效果,brk()返回值是不同的(总是相同的)比没有他们(在内核2.6.25和2.6.26尝试),但brk()仍然失败,所以传统的gcc仍然失败:-(。 另外,我已经设置vm.legacy_va_layout=1和vm.overcommit_memory=2没有任何变化,我已经用/etc/sysctl.conf中保存的vm.legacy_va_layout=1和kernel.randomize_va_space=0设置重新启动。 仍然没有改变。 编辑 : 在内核2.6.26(和2.6.25)上使用kernel.randomize_va_space=0导致strace legacy-gcc报告的以下brk()调用: […]

安装旧版本的gcc

我想在我的Ubuntu 64位系统上安装gcc 4.1.2,目前这个系统有gcc 4.4。 我想继续使用当前的gcc,但也想添加gcc 4.1.2。 任何简单的方法来做到这一点,即在我的系统上安装gcc 4.1.2?

Linux上的_emit相当于什么?

我试图将在Visual Studio中编写的汇编代码移植到Linux上的GNU内联汇编中。 原始代码使用MSDN描述的_emit作为伪指令,并解释为: _emit伪指令类似于MASM的DB指令。 您可以使用_emit在当前文本段中的当前位置定义一个即时字节。 但是,_emit一次只能定义一个字节,只能在文本段中定义字节。 它使用与INT指令相同的语法。 我怎样才能在Linux上做同样的事情?

在共享库的构build选项中添加“-rpath,/ usr / lib”会导致段错误

我有一个你好世界计划。 #include <stdio.h> #include <stdlib.h> int main() { printf("hello world! \n"); return 0; } 我在链接阶段的程序-lmicroxml中添加-lmicroxml以链接到库libmicroxml.so 当我启动我的程序时,我得到了一个分段错误。 分段故障与libmicroxml.so的加载有关。 在我的helleo世界计划执行的strace之后: strace ./test execve("./test", ["./test"], [/* 11 vars */]) = 0 old_mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|0x4000000, -1, 0) = 0x777de000 stat("/etc/ld.so.cache", 0x7f944760) = -1 ENOENT (No such file or directory) open("/lib/libmicroxml.so.1", O_RDONLY) = -1 ENOENT (No such file or […]

无法执行'x86_64-conda_cos6-linux-gnu-gcc':没有这样的文件或目录(pysam安装)

我正在尝试安装pysam。 执行完毕后: python path/to/pysam-master/setup.py build 产生这个错误: unable to execute 'x86_64-conda_cos6-linux-gnu-gcc': No such file or directory error: command 'x86_64-conda_cos6-linux-gnu-gcc' failed with exit status 1 有类似的线程,但他们似乎都解决了问题assumigpipe理员权利,我没有。 有没有办法来安装所需的文件? 免责声明:这个问题来自我以前的职位。 手动安装pysam错误:“ImportError:No module named version”但是由于它可能需要不同的方法,所以我提出了一个自己的问题。

在/ usr / local / lib中找不到gcc:链接库,但是/etc/ld/so.conf.d/libc.conf列出了它?

我遇到了共享库和gcc的问题。 起初我无法运行我编译的程序,因为我得到以下错误:加载共享库时的gcc错误。 我做了一些search,发现这是因为无法find共享库。 不过,我已经确定共享库位于/ usr / local / lib,其中AFAICT是共享库的一个常用目录,应该从头开始。 我读过,你可以设置LD_LIBRARY_PATH,这对我工作。 但是,我不希望每次我想运行我的程序设置。 进一步searchbuild议编辑ld.so.conf。 当我看到它时,有以下几点: include /etc/ld.so.conf.d/*.conf 查看ld.so.conf.d目录显示了一系列文件,包括libc.conf。 在这个文件里面是: /usr/local/lib 所以我的问题是,为什么我需要手动设置LD_LIBRARY_PATH当ld.so.conf似乎使用包含/ usr / local / lib的libc.conf? 有什么我在这里丢失,必须先configuration? 编译时有没有选项,我错过了? 我应该注意到,为了编译,我必须指定图书馆的path,我不知道这是否是我的问题或正常行为的症状。 我还应该注意到,当我在其他系统上部署我的软件时,这是我所关心的问题。 我会认为我应该能够把.so放在合适的地方,并且不用搞乱ld.so.conf就可以安装我的程序。 我希望这是这个问题的适当的论坛,我阅读了常见问题,我认为没关系。 干杯。

可以-std = c99防止我的#包含工作正常吗?

我想在Linux系统上编译一个C程序。 我有一个stdlib.h的#include语句。 当我用gcc编译程序时,如下所示: gcc -std=c99 -g -o progfoo progfoo.c progbar.c 我收到有关Implicit declaration of function [srand48, drand48, bzero, or close]警告。 编译为: gcc -g -o progfoo progfoo.c progbar.c 没有给我警告,但它确实对我使用for循环(这是首先添加-std=c99的理由)大喊大叫。 鉴于这个man srand48提到包括我所拥有的<stdlib.h> ,我不确定还有什么问题可以解决。 for循环对于任何事情来说都不是必须的(它们只是为了节省初始化数组的时间),所以我没有问题去除它们,但是在我做之前我想确认c99标准是否取代了我的#include陈述。 我正在使用gcc 4.1.2-50 (Red Hat) 。

获取不能分配内存错误

我在我的程序中得到这个错误… mprotect: Cannot allocate memory ulimit -a给出输出: core file size (blocks, -c) 0 data seg size (kbytes, -d) unlimited scheduling priority (-e) 20 file size (blocks, -f) unlimited pending signals (-i) 16382 max locked memory (kbytes, -l) 64 max memory size (kbytes, -m) unlimited open files (-n) 1024 pipe size (512 bytes, -p) 8 POSIX […]

G ++总是失败,对_Unwind_GetIPInfo未定义的引用

我刚刚升级到我的华硕EeePC上网本的Ubuntu 11.04,并与G ++有问题。 使用G ++编译任何程序,无论是使用iostream,cstdio还是stdio.h,即使是一个简单的“Hello World”,也会失败,并显示以下消息: /usr/lib/i386-linux-gnu/gcc/i686-linux-gnu/4.5.2/libstdc++.so: undefined reference to `_Unwind_GetIPInfo@GCC_4.2.0' collect2: ld returned 1 exit status 我使用新立得包pipe理器。 在升级之前,Ubuntu提供了GCC 4.4,不过我也通过另一个仓库安装了GCC 4.5(gcc-4.5)。 GCC 4.5现在是Ubuntu 11.04的默认设置。 我认为这个问题可能与libgcc有关。 我尝试重新安装GCC,但是我无法删除libgcc:首先,新立得软件包pipe理器报告说在某处存在破损的软件包,并停止了我的尝试; 但我也注意到,删除libgcc将需要删除几乎所有的应用程序,包括apt和Firefox。 我也尝试了gcc-snapshot包; 不幸的是,它给出了上面列出的相同的错误。 有什么办法可以使用新立得软件包pipe理器来获取G ++的最新工作版本?

静态和内联

我在C编程。我想要一些关于静态和内联函数的描述。 我知道,如果我们把一个函数做成静态的,那么它就是编译器的一个指示,即它只在一个翻译单元的内部链接下。 我有以下关于静态和内联的疑问: 如果我们做一个静态的函数,我们可以在其他的翻译单元中使用它…即在其他.c文件中? 如果是的话,如何? 如果我们将函数作为静态内联,那么有什么区别? 编译器如何处理它? 是否将函数作为静态函数产生与macros相同的效果? 将函数视为内联取决于编译器的大小。 那么有什么办法可以强制让它像内联一样被对待? 我们如何使用内联和静态函数进行优化? 请在上面的内容中阐明一些内容。 平台是Linux,gcc编译器,C语言。