Articles of gcc

分段错误当我在Linux上运行使用Hard Float构build的Neon代码时

我有一个代码与霓虹灯assembly优化的一个function。 我用gcc构build它,并运行在Cortex A9(硬浮动图像)上。 当我build立一个非优化代码(纯C没有汇编)与硬浮选项,如:-mapc -march = armv7-a -mtune = cortex-a9 -mfloat-abi = hard -mfpu = neon,它工作正常。 当我介绍我的汇编代码,并用下列标志进行汇编:-march = armv7 -a -mfloat-abi = hard -mfpu = neon它构build得很好,但是出现了分段错误。 还有一点需要注意的是,如果我使用-mfloat-abi = softfp代替hard(和带有-static选项的链接)来构build程序集优化代码,则运行良好。 为什么汇编代码会造成Hard float问题? 我遇到了硬/软abi选项上的其他post,但是我没有find解决scheme,我的具体情况(C代码工作,但霓虹灯大会给分段错误) 编辑:董事会没有gdb,我通过gdb服务器远程尝试,但提出了其他连接问题。 所以我不能使用gdb进行debugging。 但是,我所做的debugging:只要我进入汇编函数,我推寄存器,然后分支到最后,再次popup寄存器。 它仍然给分段错误。 我可以推断,这不是一个特定的指示给予错误。 一些标志丢失在生成文件或其他forms和特定于硬浮点的程序集中的语法? 另外,当我使用armcc选项–fpu = vfpv3_d16构build库时,它仍然可以工作。 这是很难对付的吗? 所以我推断组合GCC +汇编代码+硬盘浮动是一个问题…请给你的build议,如果你曾经与这个/类似的组合。 编辑如果汇编代码中包含像MOV r0, r1或ADD r1, r2,r2这样的明确指令,则会运行该代码ADD r1, r2,r2但在出现与LDR r1, [r2]或mov r0, #0一样的任何常量或内存相关操作的情况下会出现分段错误。 […]

指向对象types的指针

我一直在尝试创build一个类的层次结构,每个类都包含一个包含数据的嵌套结构。 ////////Class.h//////////////////////////// #ifndef _CLASS_H_ #define _CLASS_H_ #include <stdio.h> class A{//Base protected: struct dataA{ int v1, v2; }; public: A(); virtual void met1(); dataA * const set; const dataA * const get; }; class B : public A{//Child1 protected: struct dataB : public dataA{ int v3, v4; }; public: B(); virtual void met2(); dataB * const […]

编译问题在linux上

所以我在linux(Ubuntu)中使用emacs文本编辑器编写了下面的代码,它基本上应该将传入的分隔符中的string分开。 当我运行它segfaulted我运行它通过GDB,它给了我一个错误在strcpy(我没有调用),但可能在sprintf隐式完成。 我没有想到我做了什么错误,所以我启动到Windows,并通过Visual Studio运行它,它工作正常,我是新的Linux编写C,并知道问题是在While循环,我打电话sprintf()(哪是奇怪的,因为在循环之外的调用写入而不会导致错误)将令牌写入数组。 如果有人能告诉我哪里出错,我将不胜感激。 这是代码 /* split() Description: – takes a string and splits it into substrings "on" the <delimeter>*/ void split(char *string, char *delimiter) { int i; int count = 0; char *token; //large temporary buffer to over compensate for the fact that we have //no idea how many arguments will be passed […]

glibc没有正确编译

在编译glibc 2.11 ,出现以下错误。 任何想法如何解决这个问题。 In file included from ../sysdeps/unix/sysv/linux/syslog.c:10: ../misc/syslog.c: In function '__vsyslog_chk': ../misc/syslog.c:123: sorry, unimplemented: inlining failed in call to 'syslog': function body not available ../misc/syslog.c:155: sorry, unimplemented: called from here make[2]: *** [/home/alice/Desktop/glib-build/misc/syslog.o] Error 1 make[2]: Leaving directory `/home/alice/Desktop/glibc-2.11/misc' make[1]: *** [misc/subdir_lib] Error 2 make[1]: Leaving directory `/home/alice/Desktop/glibc-2.11' make: *** [all] Error 2

改变glibc,但没有任何反应

我想修改glibc。 所以我已经下载了它的一个版本,并在代码中做了一些修改。 例如,我已经改变了memset 。 但是,如果使用由编译生成的.so文件(使用LD_PRELOAD),而没有执行任何LD_PRELOAD,则看不到任何差异。 memset的行为就像它一样。 为什么? 这也许是编译器内联memset,而不是使用共享对象的任何东西? 我不明白这一点。 我甚至对printf做了修改,但是还是一无所获。 为什么。 我如何修改glibc(用于testing目的),以便我看到一个变化? 此外,当我试图通过在该函数的开头引入printf( "pthread_create")来改变pthread_create(和当然LD_PRELOAded libpthread.so)时,我只是得到了一个分段错误。 这里发生了什么? 另外,如果我在glibc源代码中进行更改后检查libc.so中的差异,则在生成的版本中看不到任何区别。 这里发生了什么。 这让我疯狂!

内联汇编 – cdecl和准备堆栈

我最近一直试图通过使用缓冲区和不同assembly操作符的RAWhex等价物来实现C ++中的dynamic函数。 为了说明一个简单的跳跃: byte * buffer = new buffer[5]; *buffer = '0xE9'; // Hex for jump *(uint*)(buffer + 1) = 'address destination'; 我在assembly方面没有经验,但是我知道足够创造非常简单的function。 现在我正在原始内存中创buildcdecl函数。 问题是,我不知道有多less我想推栈(内存)与sub 。 我们以这个函数为例: int MyTest(int x, int y) { return x + y; } long TheTest(int x, int y) { return MyTest(x, 5); } 08048a20 <_Z6TheTestii>: _Z6TheTestii(): 8048a20: 55 push %ebp […]

如何在makefile中包含* .so文件

对于我连接静态glibc库(我修改)的程序。 我的makefile看起来像这样。 CXX = g++ CXXFILES = main.c CXXFLAGS = -g -o prog -D_GNU_SOURCE LIBS = ../../nptl/libpthread.a ../../libc.a -lpthread all: $(CXX) $(CXXFILES) $(LIBS) $(CXXFLAGS) 但是,现在我不想使用静态* .a文件,而是使用dynamic共享对象* .so文件。 在makefile中用* .so文件replace* .a文件就足够了。 如果不是这样做的正确方法是什么。 我试图简单地将* .areplace为makefile中的* .so文件,但是当我这样做时,程序使用原始的glibc(而不是我的修改过的)。

Linux 32位反汇编调用指令到下一个字节

我正在为32位和64位Linux操作系统创build驱动程序。 其中一个要求就是所有的代码都需要自己包含,而且没有任何呼叫。 在64位我没有问题,但在32位GCC似乎添加到下一个字节的调用指令。 search了一下后,我发现这个链接: http://forum.soft32.com/linux/Strange-problem-disassembling-shared-lib-ftopict439936.html 有没有办法在32位Linux上禁用这个function? 例如:32位拆卸: <testfunc>: 0: push %ebp 1: mov %esp, %ebp 3: call 4 <test_func+0x4> <…some operation on ebx as mentioned in the link above> 64位disassebmly: <testfunc>: 0: push %rbp 1: mov %rsp, %rbp 3: <…no call here> “testfunc”中根本没有调用。 即使那么为什么32位编译器添加这些“调用”指令? 任何帮助表示赞赏。

安装多个版本的g ++(或gcc)

我想知道是否可以在同一台机器上安装多个版本的g ++没有任何问题。 我使用几乎最新的gcc来工作(4.6.1)。 现在我的学习,我的老师给了我们一个不完整的项目来完成,他说我们应该安装gcc 3.4.3。 请注意,我已经读过这样的内容: 是否可以同时安装两个不同版本的GCC? 但我不知道应该设置什么PATH。 此外,我想使用eclipse的两个版本。 所以我也可能需要一些指导。 非常感谢你

在使用C ++和GCC的Linux中,是否可以将虚拟地址转换为物理地址?

在Linux,C ++和GCC下,我可以得到给定虚拟地址的物理地址吗? 我知道我将无法将物理地址作为物理地址。