Articles of gcc

有什么办法在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,默认情况下只包含静态链接时实际使用的符号,还是有另一个优化标记,我应该传递给链接器? 我知道,静态链接是不好的,我只是作为一个临时的工作。

int main(){return(0);}上的浮点exception(SIGFPE) }”

我正在尝试为两个不同的Linux环境构build一个简单的C程序。 在一个设备上,程序运行良好,在另一个设备上程序产生一个浮点exception。 该程序什么都不做,但从主返回0,这使我相信有一些不符合启动代码或ABI? 该程序是与海湾合作委员会与以下build设规范编译: 使用内置的规格。 目标:i386-redhat-linuxconfiguration:../configure –prefix = / usr –mandir = / usr / share / man –infodir = / usr / share / info –enable-shared –enable-threads = posix –enable-checking = release –with-system-zlib –enable -__ cxa_atexit –disable-libunwind-exceptions –enable-libgcj-multifile –enable-languages = c,c ++,objc,obj-c ++ ,java,fortran,ada –enable-java-awt = gtk –disable -dssi –disable-plugin –with-java -home = / […]

剥离Linux共享库

最近我们被要求发布我们的一个库的Linux版本,以前我们已经在Linux下开发并运行Windows,部署库通常要容易得多。 我们遇到的问题是将导出的符号仅剥离到暴露的界面中。 有三个很好的理由想要做到这一点 通过导出的符号来保护我们技术的专有方面。 为了防止用户遇到符号名称冲突的问题。 为了加快图书馆的加载(至less我被告知)。 举一个简单的例子: TEST.CPP #include <cmath> float private_function(float f) { return std::abs(f); } extern "C" float public_function(float f) { return private_function(f); } (g ++ 4.3.2,ld 2.18.93.20081009) g++ -shared -o libtest.so test.cpp -s 并用符号来检查符号 nm -DC libtest.so 给 w _Jv_RegisterClasses 0000047c T private_function(float) 000004ba W std::abs(float) 0000200c A __bss_start w __cxa_finalize w […]

警告:函数的隐式声明“getresuid”(和“seteuid”)

我想摆脱警告。 当我编译的源代码 gcc -Wall -ansi -o test test.c 我回来了 test.c: In function 'main': test.c:12: warning: implicit declaration of function 'getresuid' test.c:14: warning: implicit declaration of function 'seteuid' 当我编译它没有-ansi开关 gcc -Wall -o test test.c 我在terminal上看到 test.c: In function 'main': test.c:12: warning: implicit declaration of function 'getresuid' 我想使用-ansi开关并摆脱警告。 我怎样才能达到我的目标? /* this is the test.c */ #include <stdio.h> […]

Cuda编译器不能使用GCC 4.5 +

我是Cuda新手,我正在编译这个简单的test_1.cu文件: #include <stdio.h> __global__ void kernel(void) { } int main (void) { kernel<<<1,1>>>(); printf( "Hello, World!\n"); return 0; } 使用这个: nvcc test_1.cu 我得到的输出是: In file included from /usr/local/cuda/bin/../include/cuda_runtime.h:59:0, from <command-line>:0: /usr/local/cuda/bin/../include/host_config.h:82:2: error: #error — unsupported GNU version! gcc 4.5 and up are not supported! 我的gcc – 版本: gcc (Ubuntu/Linaro 4.6.1-9ubuntu3) 4.6.1 Copyright (C) 2011 Free […]