Articles of gcc

如何让更多的内存和避免堆栈溢出大量的recursion?

我正在testing执行大量recursion调用的algorithm的时间。 我的程序在约128k的recursion调用中死亡,这只需要0.05秒。 我想让更多的记忆在我的分析中有更长的时间。 我正在运行Linux和使用gcc。 是否有一个系统调用,或环境variables,或gcc标志,或包装,或什么?

使用dlopen和dlsym使用-fPIC编译C程序

我有一个错误的符号parsing的问题。 我的主程序用dlsym加载了一个dlopen共享库和一个来自它的符号。 程序和库都是用C库代码编写的 int a(int b) { return b+1; } int c(int d) { return a(d)+1; } 为了使它在64位机器上工作,-fPIC在编译时传递给gcc。 该计划是: #include <dlfcn.h> #include <stdio.h> int (*a)(int b); int (*c)(int d); int main() { void* lib=dlopen("./libtest.so",RTLD_LAZY); a=dlsym(lib,"a"); c=dlsym(lib,"c"); int d = c(6); int b = a(5); printf("b is %dd is %d\n",b,d); return 0; } 如果程序不是用-fPIC编译的话,一切运行正常,但是当用-fPIC编译程序时,程序崩溃时会出现分段错误。 调查发现,坠机是由于符号a的错误parsing。 当调用a时会发生崩溃,无论是从库还是主程序(后者通过在主程序中注释掉调用c()的行来获得)。 […]

在编译affdex linux示例应用程序时未定义对进程(std :: __ cxx11 :: basic_string …)的引用

我尝试编译affdex sdk示例应用程序时遇到以下错误 Linking CXX executable video-demo CMakeFiles/video-demo.dir/video-demo.cpp.o: In function 'main': video-demo.cpp:(.text+0x11cb): undefined reference to affdex::VideoDetector::process(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) collect2: error: ld returned 1 exit status 我正在使用GCC 5.2.1

ELFdynamic加载器符号查找顺序

解决dynamic重定位时符号查找的search顺序是什么? 当parsing共享库的符号时,加载器首先在“主要可执行文件”中search(让主要可执行文件覆盖定义…)或者什么?

Linux:如何将版本信息embedded共享库和二进制文件?

在Linux上,是否有将版本信息embedded到ELF二进制文件的方法? 我想在编译时embedded这个信息,以便稍后可以使用脚本来提取它。 一个骇客的方法是种植一些可以使用strings命令提取的东西。 有没有一个更传统的方法,类似于Visual Studio植物版本信息的Windows DLL(注意DLL属性中的版本选项卡)?

简单的C代码可以在HPUX上正常工作,但是Linux上的段错误。 为什么?

我很长时间没有做过任何严肃的C,希望能够快速解释一下。 以下代码在HP / UX上编译并运行良好。 它在GCC 4.3.2上编译没有任何警告(甚至是在gcc-Wall中),但在Linux上运行时却是segfaults。 谁能解释为什么? #include <stdio.h> int main() { char *people[] = { "Abigail", "Bob" }; printf("First: '%s'\n", people[0]); printf("Second: '%s'\n", people[1]); /* this segfaults on Linux but works OK on HP/UX */ people[1][0] = 'R'; printf("First: '%s'\n",people[0]); return(0); }

旧的ARM32二进制文件可以在AARCH64内核上运行吗?

我很好奇在AARCH64-Linux机器上运行旧的ARM32-Linux程序的可行性,我进行了一些实验: 写一个程序“Hello,World!” 并用arm-none-linux-gnueabi-gcc和aarch64-linux-gnu-gcc静态编译。 静态构build并使用busybox和aarch64编译器创build一个虚拟硬盘。 把2“你好,世界!” 程序(在ARM32和AARCH64中)到ramdisk。 用vexpress_defconfig和aarch64编译器构build一个简单的AARCH64-Linux内核。 使用qemu-system-aarch64运行内核和ramdisk。 (包括ramdisk中的busybox在内的所有二进制文件都是静态编译的。) 结果: “你好,世界!” 程序在AARCH64被成功执行。 “你好,世界!” 程序在ARM32不能运行,但显示消息: 第1行:语法错误:意外的词(期待“)”) 有解决上述问题的build议或专业知识吗?

如何解决在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; […]