Articles of gcc

无法使用静态TLS加载更多对象

我有一个应用程序使用dlopen()来加载额外的模块。 应用程序和模块是在Ubuntu 12.04 x86_64上使用gcc 4.6而构build的,但是为了i386 arch。 然后将二进制文件复制到具有完全相同的操作系统的另一台机器,并正常工作 但是,如果它们被复制到Ubuntu 12.04 i386,则一些(但不是全部)模块将无法加载以下消息: dlopen: cannot load any more object with static TLS 我怀疑这是由__threadvariables的使用引起的。 但是,这些variables不会在加载的模块中使用 – 只能在加载器模块本身中使用。 有人可以提供任何额外的信息,可以是什么原因? 我正在减less__threadvariables的数量并优化它们(使用-ftls-model等),我只是好奇它为什么不能在几乎相同的系统上工作。

GCC存储的string常量以及这些指针映射的位置在哪里?

当我编译并运行我的Linux x86_64机器上的C程序时,由GCC编译: #include <stdio.h> int main(void) { char *p1 = "hello"; // Pointers to strings char *p2 = "hello"; // Pointers to strings if (p1 == p2) { // They are equal printf("equal %p %p\n", p1, p2); // equal 0x40064c 0x40064c // This is always the output on my machine } else { printf("NotEqual %p […]

使用arm-none-eabi-gcc编译和链接库liba.a错误

我在64位Linux机器上用C语言编译hello world程序。 我正在使用一个GCC ARMembedded式工具链,用一个ATMEL AT91SAM9G20处理器在FOX G20 V板上交叉编译我的程序。 在第一次,我编译时有一些错误,因为程序没有识别printf,return等函数(标准的C函数)。 所以我决定在函数之间build立链接,我相信这些函数是在libc.a库中定义的(纠正我,如果我错了),通过执​​行arm-none-eabi-gcc -o hello hello.c libc.a但结果仍然导致错误: libc.a(lib_a-exit.o): In function `exit': exit.c:(.text.exit+0x16): undefined reference to `_exit' libc.a(lib_a-sbrkr.o): In function `_sbrk_r': sbrkr.c:(.text._sbrk_r+0xc): undefined reference to `_sbrk' libc.a(lib_a-writer.o): In function `_write_r': writer.c:(.text._write_r+0x10): undefined reference to `_write' libc.a(lib_a-closer.o): In function `_close_r': closer.c:(.text._close_r+0xc): undefined reference to `_close' libc.a(lib_a-fstatr.o): In function `_fstat_r': fstatr.c:(.text._fstat_r+0xe): undefined […]

如何从stdin编译代码?

代码很简单: test$ cat test.cpp int main() { } 有没有办法编译来自标准输出的代码? 我试过这个: cat test.cpp | g++ – 和一些变化,但没有产生可执行文件。 只是一些澄清。 我有一个程序预处理一个文件,并产生我想要编译的另一个文件。 我想过不要创build这个中间文件,而是直接生成目标文件。

使链接时,gcc偏好静态库共享对象?

当使用-l选项(比如说-lfoo )链接到库时,如果两者都find了(比较喜欢libfoo.so到libfoo.a ),gcc会select共享对象到静态库。 有没有办法让gcc更喜欢静态库,如果两者都find了? 我试图解决的问题如下:我创build一个应用程序(飞行模拟器称为X平面)插件,具有以下限制: 即使在64位系统上运行,插件也应该是32位共享对象的forms 运行环境不提供加载不在“正常”位置(例如/usr/lib或/usr/lib32共享对象的简便方法: 不能指望用户设置LD_PRELOAD或LD_LIBRARY_PATH来查找我的插件附带的共享对象 在dynamic加载插件共享对象之前,X-Plane运行环境不会将我的插件目录添加到“LD_LIBRARY_PATH”,这将允许我将所有需要的共享对象与我的插件共享对象 不能指望64位用户安装非平凡的32位共享对象(比如,不包含在ubuntu的ia32-libs包中) 为了解决上面的约束,一个可能的解决scheme是将生成的共享对象与所使用的所有非平凡库的静态32位版本链接起来。 但是,在安装这样的库时,通常会安装静态和dynamic版本,因此gcc将始终链接到共享对象而不是静态库。 当然,移动/删除/删除有问题的共享对象,只是把静态库放在/usr/lib32 ,是一个解决方法,但这不是一个好的方法 注意: 是的,我读了关于如何链接共享对象和库,我并没有试图创造一个“完全静态链接的共享对象” 是的,我试过了-Wl,-static -lfoo -Wl,-Bdynamic,但没有带来预期的结果 是的,我也尝试了-l:libfoo.a ,但是这也没有带来预期的结果

为什么我能够在Linux内核模块中执行浮点运算?

我正在x86 CentOS 6.3(内核v2.6.32)系统上运行。 我将下面的函数编译成一个简单的字符驱动模块,作为一个实验,看看Linux内核如何对浮点操作做出反应。 static unsigned floatstuff(void){ float x = 3.14; x *= 2.5; return x; } … printk(KERN_INFO "x: %u", x); 代码编译(这是不期望),所以我插入模块,并与dmesg检查日志。 日志显示: x: 7 。 这似乎很奇怪, 我以为你不能在Linux内核中执行浮点操作 – 保存一些exception,比如kernel_fpu_begin() 。 模块是如何执行浮点运算的? 这是因为我在x86处理器上吗?

如何确定gcc默认将哪些命令行选项传递给ld?

考虑一下Hello world C程序: hello.c : #include "stdio.h" int main() { printf("Hello, World!\n"); } 如果我打电话: $ gcc -c hello.c -o hello.o 它会产生一个ELF可重定位文件hello.o 如果我然后打电话给: $ gcc hello.o -o hello [1] 它将链接hello.o与ld并产生一个ELF可执行文件hello 但是,如果我直接调用ld [2]而不是[1] : $ ld hello.o -o hello [2] 我得到这些错误: /usr/bin/ld.bfd.real: warning: cannot find entry symbol _start test.c:(.text+0xa): undefined reference to `puts' gcc必须将其他选项传递给ld(例如链接C库)。 有无论如何确定命令行gcc正在通过命令[1] ld通过?

GCC编译的二进制文件W /不同的大小?

如果相同的代码在不同的时间w / gcc被build立,得到的二进制将有不同的内容。 好的,我不是那么狂野,但是这就是它的原因。 不过,我最近碰到的情况是,使用相同版本的gcc构build的相同代码生成的二进制文件的大小与之前的版本(大约1900字节)不同。 有没有人有任何想法可能导致这些情况? 这是ELF的问题吗? 是否有任何工具可以用来转储二进制文件的内容来查看究竟有什么不同? 提前致谢。

如何静态构buildQt 5

我在Linux环境下使用基于Qt 5.0.1的Qt Creator 2.6.2。 该应用程序在我编译的计算机上工作正常,但是当我在另一台计算机上执行它时,出现如下错误: error while loading shared libraries: libQt5WebKitWidgets.so.5: cannot open shared object file: No such file or directory error while loading shared libraries: libxslt.so.1: cannot open shared object file: No such file or directory 我在这个链接find了一些解决scheme(一些链接已经死了)。 所以我添加到我的.pro文件这一行: CONFIG += static 要静态编译我的项目。 我以为我会得到的文件会更大,但我得到相同的大小和相同的错误。 谢谢。

需要一个简单的Linux C ++ IDE(Android NDK)

我需要一个IDE,必须: 允许运行〜/ android-ndk-r7 / ndk-build脚本进行编译; 拦截gcc输出并显示给我; 当我点击一个错误行时,转到错误位置:在提到的行打开提到的文件。 我有一个大的现有的C + +项目,并将其移植到Android / NDK。 (Code :: Blocks和Eclipse都不是第三个,也许我错过了一些东西?)