Tag: gcc

为什么这个内存地址%fs:0x28(fs )有一个随机值?

我写了一段C代码,我已经拆解了它,并且读取了寄存器以了解程序在汇编中的工作原理。 int test(char *this){ char sum_buf[6]; strncpy(sum_buf,this,32); return 0; } 我一直在研究的代码是测试function。 当我反汇编输出我的测试function时,我得到… 0x00000000004005c0 : mov %fs:0x28,%rax => 0x00000000004005c9 : mov %rax,-0x8(%rbp) … stuff .. 0x00000000004005f0 : xor %fs:0x28,%rdx 0x00000000004005f9 : je 0x400600 0x00000000004005fb : callq 0x4004a0 0x0000000000400600 : leaveq 0x0000000000400601 : retq 我想知道的是mov %fs:0x28,%rax真的在做什么?

如何在plain C中使用IDispatch来调用COM对象

我需要使用R工具中包含的gcc编译器(R为Windows的统计程序)编译我的一些代码,问题是我需要在我的代码中使用IDispatch来创建访问COM对象的方法,以及gcc编译器不支持我用来执行的大部分代码,这基本上是C ++代码。 所以我的问题是如何在C中使用IDispatch来创建COM对象,而不必依赖于MFC,.NET,C#,WTL或ATL。 我相信如果我这样做,我将能够毫无问题地编译我的代码。

理解空main()的转换为汇编

有人可以解释GCC正在为这段代码做些什么吗? 什么是初始化? 原始代码是: #include int main() { } 它被翻译成: .file “test1.c” .def ___main; .scl 2; .type 32; .endef .text .globl _main .def _main; .scl 2; .type 32; .endef _main: pushl %ebp movl %esp, %ebp subl $8, %esp andl $-16, %esp movl $0, %eax addl $15, %eax addl $15, %eax shrl $4, %eax sall $4, %eax […]

使用GCC一起编译C和C ++文件

我正在尝试使用GCC一起编译C和C ++源代码。 gcc -std=c++0x test.cpp -std=c99 test.c -lstdc++ 现在,这个工作正常,除了我得到两个警告。 cc1plus: warning: command line option “-std=c99” is valid for C/ObjC but not for C++ cc1: warning: command line option “-std=c++0x” is valid for C++/ObjC++ but not for C 因此我无法使用-Werror进行此设置。 能以某种方式抑制这些警告吗?

glibc弃用的__malloc_hookfunction的替代方案

我正在为C编写一个内存分析器,因为它通过malloc_hooks拦截对malloc , realloc和free函数的调用。 不幸的是,由于它们在multithreading环境中的不良行为而被弃用。 我找不到描述替代最佳实践解决方案的文档来实现同样的事情,有人可以启发我吗? 我已经读过一个简单的#define malloc(s) malloc_hook(s)可以解决这个问题,但是这对我想到的系统设置不起作用,因为它太过于干扰原始代码库而不适合用于分析/跟踪工具。 必须手动更改原始应用程序代码是任何体面的分析器的杀手。 最理想的是,我正在寻找的解决方案应该通过链接到可选的共享库来启用或禁用。 例如,我当前的设置使用用__attribute__ ((constructor))函数)声明的函数来安装拦截malloc挂钩。 谢谢

编译对象的布局

有没有办法 – 就像用gcc -E查看预处理的结果一样,看看我的对象在编译成目标文件后会是什么样子? 我说的是GCC,但包括MSVC在内的解决方案没问题。

为什么scanf(“%hhu”,char *)在本地时会覆盖其他变量?

标题说明了一切。 我正在使用GCC 4.7.1(与CodeBlocks捆绑在一起),我遇到了一个奇怪的问题。 考虑一下: int main() { unsigned char a = 0, b = 0, c = 0; scanf(“%hhu”, &a); printf(“a = %hhu, b = %hhu, c = %hhu\n”, a, b, c); scanf(“%hhu”, &b); printf(“a = %hhu, b = %hhu, c = %hhu\n”, a, b, c); scanf(“%hhu”, &c); printf(“a = %hhu, b = %hhu, c […]

%ms和%s scanf之间的差异

阅读scanf手册我遇到这一行: 一个可选的’m’字符。 这用于字符串转换(%s,%c,%[), 有人可以用简单的例子来解释它,在某些情况下说明这种选择的区别和需要吗?

在C中使用位字段时的字段顺序

我有一个以下类型的结构 typedef struct { unsigned int a : 8; unsigned int b : 6; unsigned int c : 2; }x, *ptr; 我想做的是改变字段c的值。 我做了类似以下的事情 x structure = { 0 }; x->c = 1; 当我查看内存映射时,我希望找到00 01 ,但我找到00 40 。 看起来在排列第二个字节时,它将c字段放在最低位中,将b字段放在最高位中。 我在GCC和Windows编译器上都看到了这一点。 现在,我做的是以下,这是正常的。 unsigned char ptr2 = (unsigned char*) ptr *(ptr2 + 1) &= 0xFC *(ptr2 + 1) […]

分析ELF部分和符号大小的工具

我需要一种方法来分析我的GCC编译器的输出文件。 我正在编制裸机,我非常关心尺寸。 我可以使用交叉编译器提供的arm-none-eabi-objdump ,但如果存在用于此任务的工具,则解析输出不是我想要做的事情。 你知道这样的工具存在吗? 我的搜索没有结果。 还有一件事,我自己的代码中的每个函数都在它自己的部分。