Articles of gcc

在x86_64 Linux中重新部署一个2GB以上的程序的链接器错误?

我有一个用户程序,通常编译有一个入口点在0x400460 ,我不得不重新定位入口点在2GB的Linux内加载的共享库开始。 例如linux-vdso.so.1 => (0x00007fff109cd000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fcd195e6000) /lib64/ld-linux-x86-64.so.2 (0x00007fcd199af000) 我正在使用gcc命令行参数-Wl,-Ttext=0x80000000来指定.text segemnt的开始地址。 问题是,当我给这个参数超过2GB的地址时,我得到一个链接器错误是: gcc test.c -ggdb -Wl,-Ttext=0x80000000 -o test1 /usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 0 has invalid symbol index 10 /usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 1 has invalid symbol index 11 /usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 2 has invalid symbol index 2 /usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 3 has invalid symbol index […]

为什么没有math函数的静态库?

只有dynamic库大多没有它们的静态版本是一个标准吗? 我特别要求math图书馆。 在我的Fedora 17(英特尔32处理器上的Linux机器),我有最新的GCC,它有libm-2.15.so和符号链接文件libm.so,但没有libm.a. 我的系统上是否缺lesslibm.a?

运行任何英特尔®AVXfunction后,math函数需要更多的周期

我注意到运行任何英特尔AVXfunction后,math函数(如ceil,round,…)需要更多的CPU周期。 看下面的例子: #include <stdio.h> #include <math.h> #include <immintrin.h> static unsigned long int get_rdtsc(void) { unsigned int a, d; asm volatile("rdtsc" : "=a" (a), "=d" (d)); return (((unsigned long int)a) | (((unsigned long int)d) << 32)); } #define NUM_ITERATIONS 10000000 void run_round() { unsigned long int t1, t2, res, i; double d = 3.2; t1 = […]

优化C ++二维数组

我需要一种方法来表示C ++中的双精度二维数组(密集matrix),并具有绝对最小的访问开销。 我已经在各种linux / unix机器和gcc版本上做了一些时机。 STLvectorvector,声明如下: vector<vector<double> > matrix(n,vector<double>(n)); 并且通过matrix[i][j]进行访问比访问声明的数组慢5%到100% double *matrix = new double[n*n]; 通过内联索引函数matrix[index(i,j)] ,其中index(i,j)计算结果为i + n * j。 其他不用STL排列二维数组的方法 – 一个n指针数组指向每一行的开始,或者定义堆栈上的整个事物为一个常数大小的matrix[n][n] – 几乎完全相同速度为指标函数法。 当开启优化时,最近的GCC版本(> 4.0)似乎能够将STLvector向量编译成几乎与非STL代码相同的效率,但这有点依赖于机器。 我想尽可能使用STL,但是必须select最快的解决scheme。 有没有人有任何与GCC优化STL的经验?

dlclose并不真正卸载共享对象,无论它被调用了多less次

我的程序使用dlopen来加载一个共享对象,然后dlclose卸载它。 有时这个共享对象再次加载。 我注意到静态variables没有重新初始化(这对我的程序是至关重要的),所以我在dlclose后添加了一个testing(使用RTLD_NOLOAD dlopen )来查看库是否真的被卸载。 果然,这仍然是在记忆中。 然后我试着重复调用dlclose直到这个库真的被卸载,但是我得到的是一个无限循环。 这是我用来检查库是否卸载的代码: dlclose(handles[name]); do { void *handle = dlopen(filenames[name], RTLD_NOW | RTLD_NOLOAD); if (!handle) break; dlclose(handle); } while (true); 我的问题是, dlclose后,我的共享对象没有被卸载的可能原因是什么,因为我的dlopen调用是唯一加载的地方。 你能提出一个行动路线来追踪问题的根源吗? 另外,为什么重复调用dlclose没有任何作用,它们都是递减引用计数,不是吗? 编辑:刚刚发现这只发生在我用gcc编译时。 随着叮当 ,一切都很好。

命令用.a文件编译c文件

我有几个.c文件和一个.a目标文件。 我应该使用什么命令与gcc编译到一个exe文件? 如果我们使用makefile,它将如何?

可以在Linux上使用.dll

问题:是否可以使用.dll文件在Linux上编译程序? 这是怎么回事:这个.dll将被用来写第三方的一些专有软件的PHP扩展。 背景和研究: 我有一个名为proprietary.lib的库。 我很好奇,因为我从来没有见过.lib扩展名,所以我input: file proprietary.lib 输出是: proprietary.lib: current ar archive 我做了一些研究,发现ar是或多或less的tar (事实上​​,我猜tar已经在大多数* nix环境中取代了ar )。 在检查ar页时,我看到了t option ,它显示了该存档内容的表格列表。 凉。 所以我input: ar t proprietary.lib 并得到: proprietary.dll proprietary.dll … (snip X lines) …

我不明白为什么编译器给我错误的代码

我有以下C代码,这对我来说看起来非常正确。 但是,clang编译器(实际上gcc或任何其他C编译器)则认为不然。 typedef struct { struct timeval td_start; struct timeval td_end; } Timer; void startTimer( struct Timer* ptimer ) { gettimeofday( &(ptimer->td_start), NULL ); } void stopTimer( struct Timer* ptimer ) { gettimeofday( &(ptimer->td_end), NULL ); } 编译器给出以下waring&error消息。 任何想法这里有什么不对? ./timing.h:14:25: warning: declaration of 'struct Timer' will not be visible outside of this function [-Wvisibility] void […]

GCC为什么以及如何编译一个缺lessreturn语句的函数?

#include <stdio.h> char toUpper(char); int main(void) { char ch, ch2; printf("lowercase input : "); ch = getchar(); ch2 = toUpper(ch); printf("%c ==> %c\n", ch, ch2); return 0; } char toUpper(char c) { if(c>='a'&&c<='z') c = c – 32; } 在toUpper函数中,返回types是char,但toUpper()中没有“return”。 并用gcc(GCC)4.5.1 20100924(Red Hat 4.5.1-4),fedora-14编译源代码。 当然,发出警告:“警告:控制达到非无效function结束”,但运行良好。 在使用gcc进行编译时,代码中发生了什么? 我想在这种情况下得到一个坚实的答案。 谢谢 :)

制作一个Ubuntu可执行文件

我使用gcc编译器在C中创build了一个程序。 现在它没有GUI组件。 我正在使用makefile编译它并在terminal中运行它。 我需要部署它,以便可执行文件是独立的。 我想要可执行文件有一个图标,点击时在terminal启动程序。 谁能告诉我如何做到这一点?