Articles of gcc

如何用C语言的内存地址映射函数名和行号?

如何在GCC中将函数名和行号映射回内存地址? 即假设一个C语言的原型: void func() { // Get the address of caller , maybe this could be avoided MemoryAddress = get_call_address(); // Which line from source code is executing , which calls func() LineNumber = get_lineno_from_symbol ( &MemoryAddress ); // Grab the name who calls func() FunctionName = get_func_from_symbol ( &MemoryAddress ); } 那么GCC提供的任何现有的API或其他什么都可以满足我的要求? 非常感谢你们的答复;

为什么gcc重新sorting函数中的局部variables?

我写了一个只读/写大型数组的C程序。 我用gcc -O0 program.c -o program编译了程序出于好奇,我用objdump -S命令来objdump -S C程序。 read_array和write_array函数的代码和程序集附在这个问题的末尾。 我正试图解释gcc如何编译函数。 我用//添加我的评论和问题 以write_array()函数的汇编代码的开始部分为write_array() 4008c1: 48 89 7d e8 mov %rdi,-0x18(%rbp) // this is the first parameter of the fuction 4008c5: 48 89 75 e0 mov %rsi,-0x20(%rbp) // this is the second parameter of the fuction 4008c9: c6 45 ff 01 movb $0x1,-0x1(%rbp) // comparing with […]

缓冲区溢出在64位

我正在试图用缓冲区溢出做一些有趣的实验。 我正在阅读这个论坛的主题,并试图写我自己的小代码。 所以我做的是一个小的“C”程序,它需要字符参数并运行,直到分段错误。 所以我提供的参数,直到我得到一个消息,我用41代替了返回地址。我的缓冲区字符长度,我复制我的inputstring是[5]。 这是我在gdb中做的。 run $(perl -e 'print "A"x32 ; ') Program received signal SIGSEGV, Segmentation fault. 0x0000000000400516 in main (argc=Cannot access memory at address 0x414141414141412d 然后我发现需要16个'A'来覆盖。 run $(perl -e 'print "A"x16 . "C"x8 . "B"x32 ; ') 0x0000000000400516 in main (argc=Cannot access memory at address 0x434343434343432f ) 这告诉我们8“C”正在覆盖返回地址。 根据在线教程,如果我提供了一个有效的地址,而不是8“C”。 我可以跳到某个地方并执行代码。 所以我在初始的16“A”之后超载了内存。 下一步是执行 run […]

不共享与共享库的所有类

像win32一样丑陋微软编译器是通过使用__declspecmacros,它确实具有明确你想要导出或不导出的好处。 现在将相同的代码移到Linux gnu / gcc系统上意味着所有的类都被导出!(?) 这是真的吗? 有没有办法不在gcc下的共享库中导出类? #ifndef WIN32 #define __IMPEXP__ #else #undef __IMPEXP__ #ifdef __BUILDING_PULSETRACKER__ #define __IMPEXP__ __declspec(dllexport) #else #define __IMPEXP__ __declspec(dllimport) #endif // __BUILDING_PULSETRACKER__ #endif // _WIN32 class __IMPEXP__ MyClass { … }

如何在Linux上加载共享库延迟

我一直在寻找一种方法来创build一个共享库(让我们命名库“ libbar.so ”) 延迟加载到Linux上,它应该只有一个链接器的帮助下实现,而不是修改任何写在源代码上的东西C ++; 我的意思是我不想在父库的源代码中调用dlopen()和dlsym() (我们将其命名为“ libfoo.so ”)来调用libbar.so的函数,因为它们会使源代码变得混乱,维护过程困难。 (简而言之,即使在Linux上,我也希望继续使用Visual Studio的/ DELAYLOAD选项) 无论如何,到目前为止,我在互联网上发现了一些与我的问题有关的不确定的信息,所以如果能得到你们所有人的回答,我们将会非常高兴地回答以下问题,以使信息清晰。 GNU ld是否支持Linux上的延迟加载机制? 如果没有,那么Clang呢? dlopen()系列是在Linux上加载共享库延迟的唯一方法吗? 我testing了通过-zlazy标志GCC(g ++)的path到库,它似乎接受的标志,但行为没有看起来使libbar.so延迟加载(没有libbar.so ,我期待有一个第一次调用libbar.so时出现exception,但在进入libfoo.so之前实际发生exception)。 另一方面,铿锵(铿锵++)留下一个警告,它忽略了选项标志。 最好的祝福,

访问附加到ELF二进制文件的数据

我有一个静态ELF二进制从zipfile中读取数据。 为了简化分发,我想将zip文件附加到二进制文件中,如下所示: $ cat mydata.zip >> mybinary 我知道这样做不会破坏mybinary,但是我不知道如何访问mydata.zip的内容。 可能吗? 如果是这样,怎么样? 在过去,我使用附加数据的附加技巧来追加数据的长度,所以我所要做的就是打开二进制文件,读取stream的最后一个int,然后重新开始解压缩,但是由于各种原因,在这里不起作用(例如,当需要zip文件时,我不能保证文件仍然在光盘上)。 如果解决scheme跨OS X和MinGW工作,则可以全面超级双分。

包含Linux GCC链接器

我不明白GCC如何在Linux下工作。 在源文件中,当我做一个: #include <math.h> 编译器是否提取了相应的二进制代码并将其插入到编译的可执行文件中?编译器是否插入了对外部二进制文件(a-la Windows DLL?)的引用? 我猜这个问题的一个通用版本是:是否有一个等效的概念,以* nix下的Windows DLL?

在Linux上编译一个共享库来定位所有发行版

我们想要创build一个共享库(.so)来定位所有的发行版,包括旧发行版。 代码是用C ++编写的,使用C ++ 11的特性,所以编译器必须至less是gcc 4.7。 我们注意到,如果我们在安装了gcc 4.7.2的Linux机器上编译我们的代码(例如,Ubuntu 12.10),那么.so生成的版本为“版本1(GNU / Linux)”,而在旧的操作系统上(例如CentOS 5.6)版本是“版本1(SYSV)” – GNU / Linux较新版本的库不能在旧的操作系统上使用。 所以我们尝试了在CentOS 5.6机器上安装gcc 4.7的方法,用这个编译器编译我们的代码,并且用libstdc ++(-static-libstdc ++)静态链接 – 这样就产生了一个.so,在我们发现的每个linux上都可以使用。 这对32位工作正常。 但是,当我们在64位操作系统(CentOS)上遵循相同的方法时,这个失败的错误是我们试图链接的现有libstdc ++。a编译时没有使用-fPIC。 所以我们试着用“-with-pic”选项来编译gcc 4.7.2源代码,但是我们不能链接到新的libstdc ++。a – 错误是: /opt/centos/devtoolset-1.1/root/usr/libexec/gcc/x86_64-CentOS-linux/4.7.2/ld:/usr/local/lib/libFoo.so:版本节点找不到符号_ZNSs7_M_copyEPcPKcm @ GLIBCXX_3。 4 /opt/centos/devtoolset-1.1/root/usr/libexec/gcc/x86_64-CentOS-linux/4.7.2/ld:未设置dynamic区段大小:错误值collect2:错误:ld返回1退出状态 我们search了编译libstdc ++与-fPIC可能会有问题,但为什么它适用于32位而不是64位的操作系统? 是否有另一种build议的方式来创build一个.so所有的Linux发行版?

G ++找不到boost库。 我说他们很明显

我正在尝试构build一些代码。 这是我得到的错误: main.o: In function `__static_initialization_and_destruction_0': /home/jmbeck/Downloads/boost_1_48_0/boost/system/error_code.hpp:214: undefined reference to `boost::system::generic_category()' 还有更多,但我不认为这是相关的。 这是build立命令: g++ -I/home/jmbeck/Downloads/boost_1_48_0 -L/home/jmbeck/Downloads/boost_1_48_0/stage/lib -lm -lboost_system -lboost_thread -lboost_regex main.cpp / home / jmbeck / Downloads / boost_1_48_0 / stage / lib目录包含预期的文件: libboost_system.a libboost_system.so@ libboost_system.so.1.48.0* libboost_thread.a libboost_thread.so@ libboost_thread.so.1.48.0* libboost_regex.a libboost_regex.so@ libboost_regex.so.1.48.0* … etc… 我试过build立一个不使用预编译库的快速程序,编译得很好。 它find适当的标题,但不是库。 我究竟做错了什么?

为什么用g ++代替gcc编译* .cc文件?

我编译了一个使用g ++而不是gcc的库。 首先,我认为源代码是用C ++编写的,但后来我发现在* .cc文件中没有任何C ++代码。 为了证实这一点,我用gccreplace了原始makefile中的g ++。 而且我还是得到了正确的scheme。 任何人都可以解释呢? 这不是我第一次遇到这样的情况。