Articles of gcc

有没有办法在运行时修改Linux C程序中的函数的代码?

简单来说,我们有两个相似的function: void f1() { printf("%d", 123); } void f2() { printf("%d", 124); } 现在我们在main调用f1,它打印123.编译时, f1的反汇编可能是这样的: 08048424 <f1>: 8048424: 55 push %ebp 8048425: 89 e5 mov %esp,%ebp 8048427: 83 ec 18 sub $0x18,%esp 804842a: b8 40 86 04 08 mov $0x8048640,%eax 804842f: c7 44 24 04 7b 00 00 movl $0x7b,0x4(%esp) 8048436: 00 8048437: 89 04 […]

不能理解在linux中关于函数调用的简单c代码的输出

当我试图理解函数调用时,我写了一个简单的代码。 但是我不明白它的输出。 #include <stdio.h> int* foo(int n) { int *p = &n; return p; } int f(int m) { int n = 1; return 999; } int main(int argc, char *argv[]) { int num = 1; int *p = foo(num); int q = f(999); printf("[%d]\n[%d]\n", *p, q); /* printf("[%d]\n", *q); */ } 输出: [999] [999] […]

了解C程序中的汇编语言_start标签

我写了一个简单的C程序,并试图使用GDB来debugging程序。 我明白在主要function中使用以下内容: 在进入 push %ebp mov %esp,%ebp 退出时 leave ret 然后我尝试gdb的_start,我得到了以下 xor %ebp,%ebp pop %esi mov %esp,%ecx and $0xfffffff0,%esp push %eax push %esp push %edx push $0x80484d0 push $0x8048470 push %ecx push %esi push $0x8048414 call 0x8048328 <__libc_start_main@plt> hlt nop nop nop nop 我无法理解这些线,以及这背后的逻辑。 有人可以提供任何指导,以帮助解释_start的代码?

为什么更新大数组使得“change_protection”内核调用占主导地位的CPU?

这里是代码gcc test.c -std=c99 #include <stdio.h> #include <stdlib.h> void main() { size_t size = (long) 40 * 1024 * 1024 * 1024; int* buffer = malloc(size * sizeof(int)); for (size_t i = 0; i < size; i++) { buffer[i] = 1; } printf("hello\n"); for (size_t i = 0; i < size; i++) { buffer[i] = 2; […]

移动到不同的Linux构build系统,出现错误:undefined symbol:stat

这可能只是我正在迁移到的构build系统的一个问题,但是我将在两个系统中包含差异以及我如何遇到问题。 我的旧版本系统是SLES 10机器。 gcc / cpp / g ++版本是4.1.0 我的新系统在SLES 11 SP4上,而gcc / cpp / g ++版本是4.3.4。 我正在build立一个共享库; 在新系统上build立和连接工作很好。 但是,在新系统加载时,我得到以下结果: error ./mysharedlib.so: undefined symbol: stat 由于status()函数包含在/usr/include/sys/stat.h中,所以我在两个系统上查看了glibc。 旧: # rpm -q -f /usr/include/sys/stat.h glibc-devel-2.4-31.2 和新的: # rpm -q -f /usr/include/sys/stat.h glibc-devel-2.11.3-17.95.2 我还查看了旧系统上与stat()相关的objdump输出: # objdump -T mysharedlib.so | grep stat 0000000000000000 D *UND* 0000000000000000 __xstat # objdump […]

有没有人用C ++封装函数的例子?

我在网上search了很多,但我找不到一个与g ++一起工作的例子,所有的例子都使用gcc。 我不断收到的错误是 wrap_malloc.o: In function `__wrap_malloc(unsigned int)': wrap_malloc.cc:(.text+0x20): undefined reference to `__real_malloc(unsigned int)' wrap_malloc.o: In function `main': wrap_malloc.cc:(.text+0x37): undefined reference to `__wrap_malloc' collect2: ld returned 1 exit status 创build这个错误的代码如下(如果我使用gcc进行编译并将头文件从cstdio更改为stdio.h,则此代码有效): #include <cstdio> #include <cstdlib> void *__real_malloc(size_t); void *__wrap_malloc(size_t c) { printf("My malloc called with %d\n", c); return __real_malloc(c); } int main(void) { void *ptr = […]

使用交叉编译器编译原生GCC for arm

我期待为ARM系统创build一个GCC的本地版本,我遇到了一些麻烦。 生成机器是i686-linux。 我看到的每个教程都告诉我如何设置实际的交叉编译套件(我已经使用了crosstools-ng)。 但是,我没有看到任何与编译本机ARM GCC有关的东西。 我使用的configurationstring如下,我只设置了标头的sysroot。 我还交叉编译并安装了GMP和MPFR。 ../../gcc-4.3.5/configure –host=arm-unknown-linux-gnueabi –build=i686-build_pc-linux-gnu –target=arm-unknown-linux-gnueabi –prefix=/home/vm/gcc-native/sysroot –with-sysroot=/home/vm/gcc-native/sysroot –enable-shared –enable-threads –disable-libmudflap –disable-libssp –disable-libgomp –disable-libstdcxx-pch –with-gnu-as –with-gnu-ld –enable-languages=c,c++ –enable-symvers=gnu –enable-__cxa_atexit –disable-nls –disable-multilib –with-gmp=/home/vm/gcc-native/sysroot/ –with-mpfr=/home/vm/gcc-native/sysroot/ 海湾合作委员会将build立一段时间,但随后死亡: checking for suffix of object files… configure: error: cannot compute suffix of object files: cannot compile. 我不知道这将甚至会运行在我的系统上,因为我在i686-linux上构build,目标/主机都是arm-linux。 我现在的想法是find一个ltib发行版,看一个GCC的规格文件,并试图遵循所有的步骤。 由于与std命名空间冲突,我的板上运行的GCC无法在我的系统上编译。 任何信息/链接将不胜感激!

STL容器内存问题

我正在用gcc 4.3.2在linux(Fedora 10和CentOS 5)中实现我自己的图库,并使用STL容器,然后我发现内存有问题。 当我build立我的图表时,我使用了足够多的内存来查看顶部或另一个内存使用工具。 我确定我正在释放内存(我一遍又一遍地检查了代码,并使用了valgrind来检查内存泄漏),但内存仍然在使用中(我可以在顶部或cat / proc / meminfo中查看)而当我再次创buildgraphics时,它不会增加内存使用量,显然重新使用分配的内存。 经过几天的debugging,我创build了一个非常简单的代码,有同样的问题。 #include <iostream> #include <list> // Object that occupies 128KB. // Data is not important. class MyObject { public: int * a; int * b; int * c; int * d; MyObject( ) { a = new int[ 8192 ]; b = new int[ 8192 […]

用gcc -pg -g编译后,gmon.out不会写入

使用gcc -pg -g编译C ++程序(至less,这些是我在Makefile中给出的参数;没有任何有关执行命令的确凿证据)。 程序运行到CWD设置为我的主目录正常完成。 没有gmon.out文件写入。 gcc是4.4.7。 操作系统是centos 6。 我的程序是使用fork / exec手动启动的Perl守护进程启动的。 我已经validation了CWD是我的主目录,而且它是可写的,通过让守护进程在执行我的目标程序之前执行touch foo 。 据我所能研究,这应该不会影响程序的分析或写(gmon.out),当它终止(通常)。

在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 […]