Endian

0x11223344 Big Endian 高字节放低地址 Offset 0x00 0x01 0x02 0x03 data 0x11 0x22 0x33 0x44 PowerPC/8051/ Network/ Little Endian 低字节放低地址 Offset 0x00 0x01 0x02 0x03 data 0x44 0x33 0x22 0x11 x86/ARM/…

GNU链接脚本分析

08年搞了一个可以在linux下使用GNU GCC编译的NXP工程,学到了不少东西。从linux kernel、u-boot借鉴了不少东西,下面对链接文件做一个简单分析。 名词解释 The Location Count(.) - 地址计数器 Load Memory Address(LMA) - 加载内存地址 Virtual Memory Address(VMA) - 虚拟内存地址 section contents - 段内容 Input Section - 输入段 Output Section -…

如何使用g++链接C库

通常我们会用gcc编译动态链接库给用户使用,而用户则可能使用g++。这样就会有一个问题,链接的时候经常找不到函数。如何解决这个问题呢,我们先看以下为什么找不到。 大家知道,c++是支持函数重载。也就是说,相同名字的函数可以在c++中定义多次,只需要返回值或者函数参数不同即可。 我们分别用g++和gcc编译同一个文件看看其生成的二进制文件。 [crayon-68033cdb66f74588788108/] 使用gcc编译后 [crayon-68033cdb66f77223370153/] 使用g++编译后 [crayon-68033cdb66f78761006881/] 很明显。对于同一个源文件,同一个函数,使用不同的编译器下编译出了不同的结果。gcc编译后还是ScardOpen,而g++编译后变成了_Z9SCardOpenv。而函数的实现则是完全一样的。 因为g++是支持函数名重载的。所以单靠函数名是不能区分不同的函数的,随意它在函数名字的前后都加了一些内容。这就是链接使用不同的编译器编译出来的动态链接库无法找到函数的原因。 如何解决呢。因为C++是在C之后出现的。所以C++可以通过一些选项兼容C语言。我们可以在我们提供给用户的头文件里加入extern “C” {} 解决问题 比如: [crayon-68033cdb66f79135884872/] g++发现有extern “C”包含的东西会以C的方式链接,而定义了__cpluspluc则表示如果使用g++编译则定义extern “C”