Articles of gcc

64位系统上的NULL定义问题

我使用gcc 4.1.2在RHEL 5.1 64位平台上运行。 我有一个实用的function: void str_concat(char *buff, int buffSize, …); 其中concat char *在可变参数列表(…)中传递,而最后一个参数应为NULL,以指定参数结束。 在64位系统上,NULL是8个字节。 现在的问题。 我的应用程序包括直接/间接2 stddef.h文件。 首先是/usr/include/linux/stddef.h ,它定义了NULL,如下所示: #undef NULL #if defined(__cplusplus) #define NULL 0 #else #define NULL ((void *)0) #endif 第二个是/usr/lib/gcc/x86_64-redhat-linux/4.1.2/include/stddef.h #if defined (_STDDEF_H) || defined (__need_NULL) #undef NULL /* in case <stdio.h> has defined it. */ #ifdef __GNUG__ #define NULL __null […]

如何在centos6上分发c ++ 11共享库

我有一个C ++ 11库( https://github.com/matiu2/cdnalizer )。 我想分发到centos6和ubuntu12.04 LTS。 它在Ubuntu 13.10和Gentoo上愉快地编译。 我尝试尽可能多的静态编译,但它仍然取决于centos没有的glibc: matiu@matiu-laptop:~/projects/cdnalizer/build/src/apache$ readelf -d mod_cdnalizer.so | grep NEED 0x0000000000000001 (NEEDED) Shared library: [libapr-1.so.0] 0x0000000000000001 (NEEDED) Shared library: [libstdc++.so.6] 0x0000000000000001 (NEEDED) Shared library: [libgcc_s.so.1] 0x0000000000000001 (NEEDED) Shared library: [libc.so.6] 0x000000006ffffffe (VERNEED) 0xd520 0x000000006fffffff (VERNEEDNUM) 3 build造线: /usr/bin/g++ -fPIC -I/usr/local/include -I/usr/include -I/usr/include/x86_64-linux-gnu -I/usr/include/x86_64-linux-gnu/c++/4.8 -Wall -Wextra -g -shared -Wl,-soname,mod_cdnalizer.so […]

htonl()vs __builtin_bswap32()

__builtin_bswap32()用于反转字节(它用于littel / big endian问题(来自gcc))。 htonl()也用于反转字节(从主机到networking的转换)。 我检查了两个函数,他们返回相同的结果。 有没有人可以确认这两个function是一样的? (标准的refences是赞赏)

与电篱笆库海湾合作委员会不生效

我写了一个在dynamic分配时有内存问题的代码片段; 当用-lefence选项编译时,似乎没有效果。 这里是代码段: int main(int argc, char *argv[]) { int *a = (int *)malloc(2*sizeof(int)); for(int i = 0; i <=2; ++i){ a[i] = i; printf ("%d\n",a[i]); } free(a); return 0; } 和编译选项: gcc -g3 -Wall -std=c99 outOfBound.c -lefence 预期的结果是,当执行a.out时, i将分配给2并且调用a[i]=i之后会有一个核心转储。 那么为什么 – -lefence不起作用? 我也把循环上限增加到了9,但是还没有electric-fence调用的核心转储。 (实际上默认是有一个核心转储,但是这可能是由于MALLOC_CHECK_ env可取的,因为当我export MALLOC_CHECK_=0 ,将不会有更多的核心转储)。 更新 : nm -A a.out的全部结果如下: a.out:08049f28 d […]

我怎样才能衡量在Linux的真正的CPU使用情况?

我知道有一些像top和ps这样的测量CPU使用率的工具,但是他们测量CPU使用率的方式是测量空闲任务没有运行的时间。 因此,例如,即使CPU因高速caching未命中而失速,这些工具仍会考虑占用CPU。 不过,我想要的是,分析工具在失速期间将CPU视为空闲。 有没有什么工具可以做到这一点?

“Pentium4及以上”处理器的海湾合作委员会的最佳游行和选项是什么?

我的C ++应用程序(使用g ++编译)需要在Pentium-4(32位)及更高版本上工作。 但是,它通常与Core2Duo或更好的处理器一起使用。 我目前正在使用: -march = pentium4 -mtune = pentium4 。 但有些阅读促使我认为-march = pentium4 -mtune = generic可能会更好。 任何人都可以对此有所了解吗? 在这种情况下,三月和三月的最佳select是什么? 平台:RHEL 5.3(32位)上的GCC 4.1.2。

程序加载/执行

我是编译器的初学者,但是我非常有兴趣了解一个程序是如何构造的(二进制)以及如何读取和加载到内存中执行。 你们build议我阅读哪些电子书/书籍/教程以便快速入门?

线程本地存储variables的地址

好吧,说我有 __thread int myVar; 然后,我把&myVar从一个线程传递到另一个线程……如果数据是真正的“本地”,那么1个线程的TLS存储可能不会映射到其他线程地址空间,事实上,你可以说它应该不会的 。 这将导致一个SIGSEGV或其他东西。 但是,系统可以将相同的地址映射到不同的页面。 这是Linux用.tbss / .tdata做的事吗? 在这种情况下,传递variables的地址会给你错误variables的地址! 你会得到你自己的本地副本,而不是你试图通过的副本。 或者,一切都被共享和映射到不同的虚拟地址 – 允许你传递__线程variables的地址? 显然,应该被打败,因为试图通过传递其地址传递线程本地存储到另一个线程。 还有其他一些方法 – 例如复制到任何其他variables! 但是,如果有人知道,我很好奇。 官方描述了这种情况下的行为 目前的GCC / Linux实施细节 – 埃文

如何使用-std = gnu99编译Linux内核模块?

我最近学会了如何编写简单的字符驱动程序,并且在使用代码的同时,我注意到我的C99代码中出现了很多下面的GCC警告: warning: ISO C90 forbids mixed declarations and code 我认为这是因为主要的Linux内核Makefile被设置为使用非C99标准进行编译。 我周围search我在这里find了这个答案在stackoverflow: 如何使用make和编译为C99? 所以我自然在我的Makefile中尝试了以下内容: ccflags-y := -std=gnu99 不幸的是,这并没有消除GCC警告。 我检查了make的详细输出并validation了GCC确实是在最后加上-std=gnu99执行的。 所以我有点困惑。 如何使用-std=gnu99选项正确编译Linux内核模块? 编辑 : 我注意到GCC输出显示了这个选项: -Wdeclaration-after-statement 。 这就是为什么我即使使用-std=gnu99选项也会得到警告?

安装捆绑使用rvm,ruby1.8.7与Linux上的GCC 4.7

在linux(Fedora 17,Arch等)上安装ruby 1.8.7或者安装GCC 4.7的bundle gem。 这个问题发生在我使用RVM的时候。 我能够安装1.8.7,但无法安装捆绑软件gem。 我会收到以下错误: $ gem install bundler ~/.rvm/rubies/ruby-1.8.7-p358/lib/ruby/1.8/timeout.rb:60: [BUG] Segmentation fault ruby 1.8.7 (2012-02-08 patchlevel 358) [x86_64-linux] 这个问题在很多地方都有描述,其中包括: ruby-enterprise 1.8.7-12:timeout.rb:60:[BUG]分割错误 ruby安装是seg错误 rvm在archlinux上安装rbx失败(mri 1.8 + gcc 4.7问题) ruby1.8:使用gcc-4.7编译时的段错误 Ruby 1.8.7无法构build(Arch Linux,gcc> 4.6)