Articles of gcc

如何解决在Linux 32位机上的REG_EIP未声明(首次在此函数中使用)错误?

我在用C语言编写的用gcc编写的信号处理器程序时遇到了错误,在发生分段错误后显示转储的寄存器值。 当我尝试使用代码访问它时: void print_registers(FILE *fd, ucontext_t *ctx, bool fpu = false) { const char *flags_str[] = { "CF", 0, "PF", 0, "AF", 0, "ZF", "SF", "TP", "IF", "DF", "OF", 0, 0, "NT", 0, "RF", "VM", "AC", "VIF", "VIP", "ID" }; greg_t *regs = ctx->uc_mcontext.gregs; void *eip[1] = { (void*)regs[REG_EIP] }; char **symbol = backtrace_symbols(eip, 1); […]

无法运行编译的文件 – bash:./a.out:权限被拒绝。 (我试过chmod)

我使用cc test.c编译了我的C源代码,并生成了a.out文件。 但是,当我运行它,我得到这个错误 – bash: ./a.out: Permission denied 我的源不在主目录中,它位于不同的FAT-32分区上,所以我使用以下命令安装了代码所在的驱动器 – $ udisks –mount /dev/sda7 –mount-options umask=022 Mounted /org/freedesktop/UDisks/devices/sda7 at /media/48E9-FD53 $ cd /media/48E9-FD53/C 然后我使用cc编译我的代码 我也试过gcc 。 但是我仍然得到相同的错误。 然后我做了 – chmod +x a.out ,仍然是同样的问题。 还有( chmod 755 a.out )和chmod u+x a.out 。 我也试着用sudo编译和执行程序。 我也试过 – sudo chown sannidhya:sannidhya a.out 。 我尝试了Googlesearch后发现的所有内容,但仍无法使其正常工作。 我如何运行.out文件(不移动到主目录)? 注 – 我正在使用Ubuntu 12.04 […]

为什么我得到这个错误? void *不是指向对象types的指针。

void *stackAddr[NUM_THREADS]; stackAddr[i] = malloc(STACKSIZE); 编译器(g ++ 4.4.3)抱怨malloc被调用的地方… warning: pointer of type 'void *' used in arithmetic error: 'void*' is not a pointer-to-object type 如果你有兴趣看到整个代码,在这里它… #include <pthread.h> #include <stdio.h> #include <stdlib.h> #include <math.h> #define NUM_THREADS 4 void *stackAddr[NUM_THREADS]; pthread_t thread[NUM_THREADS]; pthread_attr_t attr; void *BusyWork(void *t) { int i; long tid; double result=0.0; tid = (long)t; […]

为共享库文件(* .so)生成头文件(* .h)

我有共享库文件( libmylib.so ),但没有头文件( mylib.h )。 你知道一些方法/工具从共享库文件生成这个头文件吗?

在C预处理器中避免双重macros观replace

这是一个简单的小C程序,让我困惑了一会儿: #include <stdio.h> #define STR1(x) #x #define STR(x) STR1(x) int main(void) { printf("%s\n", STR(MYDEF)); } 这只是使用标准的string化双定义技术将stringMYDEF #define的值打印出来。 使用gcc -DMYDEF=abc prog.c编译(在Linux上)运行结果,并不奇怪,它打印出'abc'。 但是改变gcc -DMYDEF=linux prog.c的值,打印的结果不是'linux',而是'1'。 所以这让我困惑了一下,但是当然是因为gcc(在Linux上)发现了一个名为'linux'的内置的#define,其值为'1',而STR(x)macros最后将MYDEF扩展为“linux”,然后将linux扩展为“1”。 在我真正的程序中(这比上面的小testing要复杂得多),我用一种不同的(可能更好的)方式来处理这个事情,但是这让我好奇……是否有一个简单的小macros技术可以避免这个双重replace,并使程序打印出'linux'? 我知道我可以添加一个-U或#undef的Linux,但是这感觉有点笨拙。 我以为所有内置的#define都以下划线(通常是双下划线)开头,但我猜不是。

如何在Linux中使用gcc的旧版本

在Linux中,我试图编译使用-fwritable-strings选项的东西。 显然这是一个gcc选项,在新版本的gcc中不起作用。 我在我的系统上安装了gcc-3.4,但我认为新版本仍然在使用,因为我仍然得到错误,说它无法识别命令行选项-fwritable-strings。 我怎样才能使用旧版本的gcc?

g ++ 4.1.2没有在此范围内声明runtime_error

相同的代码在gcc 4.5.2上正常工作,但是当试图在gcc 4.1.2上编译时,我得到错误'runtime_error' was not declared in this scope 。 我有 #include <stdexcept> 这是gcc 4.1.2的问题吗? 代码摘录 // Constructor if (resource cannot be acquired) throw std::runtime_error("Blah Blah");

GCC是否支持命令文件

MSVC编译器支持用于传递命令行选项的命令文件 。 这主要是由于可以传递给CreateProcess调用的命令行参数的大小的限制。 这在Linux系统上不是什么问题,但是在执行Unix应用程序(如gcc)的cygwin端口时,应用相同的限制。 因此,有没有人知道如果gcc / g ++也支持某种types的命令文件? 谢谢。

传统的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?