Articles of gcc

如何debugging一个C程序

我正在使用Linux , GCC和C 我有一个make文件。 我想debugging我的模块。 我不想debugging单个文件,我想debugging整个模块。 我该怎么做?

.eh_frame和.eh_frame_hdr部分存储的是什么?

我知道,在使用支持exception的语言(如C ++)时,必须向运行时环境提供附加信息,以描述在处理exception期间必须展开的调用帧。 此信息包含在对象文件的特殊部分中,例如.eh_frame和.eh_frame_hdr 。 但是,这些部分存储了什么样的数据结构呢? 我的意思是,他们可以通过使用任何C结构? 他们和GNU汇编代码中的.cfi语句(如.cfi_startproc , .cfi_endproc , .cfi_offset , .cfi_def_cfa_offset , .cfi_personality和.cfi_lsda )有什么关系? 如果他们这样做,这些条款中的每一个在这些部分中造成了什么? .eh_frame_hdr部分与.eh_frame之一有什么关系? 我希望尽可能多的使用C结构的解释。 谢谢。

将-rdynamic链接器选项添加到gcc / g ++会影响性能吗?

我想在应用程序崩溃时获取堆栈跟踪。 我明白,-rdynamic选项可以使用函数名称获取完整的堆栈跟踪。 但是我担心是否会对我的申请performance有任何影响。

如何从共享库链接到相对path的共享库

我正在使用外部库在浏览器上渲染3Dgraphics的Firefox插件。 问题是,我希望插件使用与其一起打包的外部库,而无需更改LD_LIBRARY_PATHvariables。 这些库安装在相对于插件(共享库)的位置,而实际的可执行文件(即浏览器)可以位于其他地方。 有些事情你必须知道。 我在Ubuntu上testing它(没有问题在Windows版本的插件)我的依赖是OpenSceneGraph库和静态编译将使插件真的很大(如果有另一个不是一个选项) 希望你能帮我 最好的祝福。

有什么办法在C或C ++运行时编译额外的代码?

这是我想要做的: 运行一个程序并初始化一些数据结构。 然后编译其他可以访问/修改现有数据结构的代码。 根据需要重复步骤2。 我希望能够在类Unix系统(特别是Linux和Mac OS X)上使用gcc (最终是Java )在C和C++执行此操作。 这个想法基本上是为这些语言实现一个read-eval-print循环,这些语言在input时编译expression式和语句,并使用它们修改现有的数据结构(在脚本语言中始终进行的操作)。 我正在写这个工具在python ,它生成的C / C++文件,但这不应该是相关的。 我已经探讨了如何使用共享库,但了解到修改共享库不会影响已经运行的程序。 我也尝试使用共享内存,但无法find加载到堆的函数的方法。 我也考虑过使用汇编代码,但还没有试图这样做。 我宁愿不使用gcc以外的编译器,除非在gcc绝对没有办法做到这一点。 如果任何人有任何想法或知道如何做到这一点,任何帮助将不胜感激。

如何使用多个版本的GCC

我们有一个新的应用程序需要glibc 2.4(来自gcc 4.1)。 我们运行的机器有gcc 3.4.6。 我们不能升级,应用程序必须在这台机器上运行。 我们安装了gcc 4.1,但是编译时使用了3.4.6中的所有包含等等。 我们如何解决这个问题? 任何build议使用4.1只是这个应用程序?

格式化struct timespec

如何格式struct timespecstring? 这个结构是通过例如在Linux gcc上的clock_gettime()返回的: struct timespec { time_t tv_sec; /* seconds */ long tv_nsec; /* nanoseconds */ };

加载不同版本的多个共享库

我有一个Linux上的可执行文件加载libfoo.so.1 (这是一个SONAME )作为其依赖项之一(通过另一个共享库)。 它还链接到另一个系统库,该库又链接到系统版本libfoo.so.2 。 因此, libfoo.so.1和libfoo.so.2都是在执行过程中加载的,本来应该从版本1的库调用函数的代码最终会从具有版本的较新系统库调用(二进制不兼容的)函数2,因为一些符号保持不变。 结果通常是堆栈粉碎和随后的段错误。 现在,与旧版本链接的库是一个封闭的第三方库,我无法控制它编译的libfoo版本。 假设,剩下的唯一select是重build一系列与libfoo.so.2链接的系统库来链接libfoo.so.1 。 有没有办法避免用连接到较旧的libfoo本地副本来replace系统库? 我可以加载这两个库,并有代码调用符号的正确版本? 所以我需要一些特殊的符号级版本?

共享库是否与应用程序使用相同的堆?

假设我在Linux中有一个使用共享库( .so文件)的应用程序。 我的问题是,这些库中的代码是否将分配与主应用程序相同的堆内存,或者他们使用自己的堆? 因此,例如, .so文件中的某个函数调用malloc ,它会使用与应用程序相同的堆pipe理器还是另一个? 另外,那些共享内存中的全局数据呢? 它在哪儿撒谎? 我知道应用程序位于bss和数据段,但不知道这些共享对象文件的位置。

如何在使用gcc进行静态链接时仅包含已使用的符号?

我正在部署一个用gcc编译的小程序,4.3.2-1.1(Debian)。 这个程序将部署在从Debain 5到最新的Fedora,Ubuntu,Slackware,Arch等虚拟机模板上。 该程序依赖于Xen库中的某些符号,这些符号仅在不稳定的树中可用。 因此,通过虚拟机模板上的各个软件包pipe理器来安装Xen的库并不能解决我的问题。 直到我打包我自己版本的这些库,我需要静态链接可执行文件。 gcc 4.3-x,默认情况下只包含静态链接时实际使用的符号,还是有另一个优化标记,我应该传递给链接器? 我知道,静态链接是不好的,我只是作为一个临时的工作。