Articles of gcc

返回到libc在gdb中工作,但不是在单独运行时

我正在尝试使用以下简单代码返回到libc技巧: #define SYSTEM_CALL_ADDR 0xb7ec5e50 /*my system call addr*/ #define EXIT_CALL_ADDR 0xb7ebbb80 /*my exit call addr*/ char shell[] = "/bin/sh"; int main(){ int* p; p = (int*)&p + 2; *p = SYSTEM_CALL_ADDR; p = (int*)&p + 3; *p = EXIT_CALL_ADDR; p = (int*)&p + 4; *p = shell; return 1; } 有趣的是,当我运行这个程序时,它以“分段错误”结束,但如果我使用gdb进行debugging并逐步运行,那就完全正常了,产生一个shell然后退出程序。 有人遇到这种情况? 或者有人请指导我如何纠正这一点? 首先感谢。 我在ArchLinux内核上:2.6.33,gcc […]

编译和链接Debian 64位上的32位应用程序

我目前正在试图编译和链接我的Debian 64位上的32位应用程序,但在链接时失败。 我正在使用(在我的Makefile中)编译的命令是: gcc -Os -m32 -Wall -g -c $< -o $@ 这似乎工作。 然后我用下面的命令链接: gcc -m32 -lcurses $^ -o $@ 这会失败,并提供以下错误: /usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/4.4.5/../../../libcurses.so when searching for -lcurses /usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/4.4.5/../../../libcurses.a when searching for -lcurses /usr/bin/ld: skipping incompatible /usr/lib/libcurses.so when searching for -lcurses /usr/bin/ld: skipping incompatible /usr/lib/libcurses.a when searching for -lcurses /usr/bin/ld: cannot […]

如何使libusb库对另一个程序可见?

我正在编译hidapi库。 为了编译,我需要libusb-1.0 。 我已经下载,configuration,制作并安装到/usr/local/lib 。 但是当我尝试编译hidapi ,并没有看到libusb-1.0 : cc -Wall -g -c -I ../ hidapi pkg-config libusb-1.0 –cflags hid-libusb.c -o hid-libusb.o -L / usr / local / lib在libusb-1.0中找不到包pkg-configsearchpath。 也许你应该将包含`libusb-1.0.pc'的目录添加到PKG_CONFIG_PATH环境variables中。找不到包'libusb-1.0'/ bin / sh:cc:not found make: * [hid-libusb.o]错误127 我该如何解决这个问题? (编译发生在Synology NAS上)

沙盒公开访问GCC

我想添加一个function到一个基于Linux的Web服务,允许不可信用户上传源代码到一个小的C ++程序,并将该代码自动保存到服务器上的文件,并用gcc编译,然后执行,捕获标准输出。 (这是一个与ideone.com,或者spoj.pl,或者topcoder.com,或者codechef.com或者许多其他网站完全不同的function。) 我的问题是: Q1。 我如何沙箱的可执行文件,以防止恶意用户试图破坏文件系统或访问networking等? Q2。 是否有一个公平/准确的方法来将系统资源加速处理,如处理器时间和内存使用情况?

如何用最新的GCC构build旧的源代码?

我正在尝试构buildOSKit源代码。 它是最初写在gcc 2.95.2,但在我的箱子,我得到了gcc 4.3.2。 而4.3.2不允许以下语法: asm volatile(" pushfl popl %0" : "=r" (eflags)); return eflags; 4.3.2总是抱怨说: error: missing terminating " character 有这么多的语法,有没有办法让4.3.2接受这个? 还是有更通用的方法让4.3.2像2.95.2一样? 或者我可以在哪里下载gcc的2.95.2版本? 谢谢! 更新 我真正的目标是build立OSKit 。 OSKit声称是与GCC 2.7.x或2.95.2 compilabe。 我的Ubuntu 8.10安装了GCC 4.3.2。 我尝试了以下编译序列: 4.3.2build立2.95.2 —失败 4.3.2-> 3.3.6 – > 2.7.2.3 —成功。 4.3.2 – > 2.7.2.3 —成功 3.3.6 – > 2.95.2 —失败 虽然我还没有2.95.2,但我至less得到了2.7.2.3。 但OSKit仍然与2.7.2.3 […]

pthread_create导致分段错误

我的程序包含以下代码。 pthread_t PThreadTable[32]; for (i=1; i<P; i++) // Checked with P = 4 { long i, Error; printf( "pthread_create %d!\n", i ); Error = pthread_create(&PThreadTable[i], NULL, (void * (*)(void *))(SlaveStart), NULL); if (Error != 0) { printf("Error in pthread_create().\n"); exit(-1); } } SlaveStart(); 该代码给调用pthread_create (通过gdb和valgrind检查)分段错误。 为什么这样?

rand()不返回随机值

它的一个小代码来生成一个随机厄米matrix厄密matrix 。 在每次调用rand()之前,我都调用了srand()。 但输出中仍然没有随机性。 我已经使用c99的复杂数据typesfunction来创build一个厄密matrix。 我不知道我错在哪里:( #include <stdio.h> #include <math.h> #include <complex.h> #include <stdlib.h> #include <time.h> #define MATSIZE 5 #define RAND_RANGE 100 double complex mat[MATSIZE][MATSIZE]; void gen_mat() { int i =0,j; int real; int img; for( ;i < MATSIZE; i++) { srand(time(NULL)); real = rand()%RAND_RANGE + 1; srand(time(NULL)); img = rand()%RAND_RANGE + 1; for(j = […]

使用gcc / g ++ / gdb / valgrind进行debugging时的魔术数字?

微软的Visual C ++如果没有被程序员自己初始化,就会用“幻数”填充内存。 这有助于debugging未初始化的内存。 ( 在Visual Studio C ++中,什么是内存分配表示? , 0xDEADBEEF与NULL ) 使用Linux GNU工具(g ++ / gdb)时有没有类似的function? 谢谢!

我的蹦床不会反弹(绕路,C ++,GCC)

这感觉就像我滥用我所有的问题Stackoverflow,但它是一个问答论坛毕竟:)无论如何,我已经使用了一段时间了,但我还没有实现我自己(我已经使用包装更早)。 因为我想完全控制我的代码(谁不?),我决定自己实现一个function齐全的绕行程序,所以我可以理解我的代码的每个字节。 代码(下面)尽可能简单,但问题不是。 我已经成功地实施了绕道(即我自己的function),但是我还没有能够实施蹦床 。 每当我打电话给蹦床,根据我使用的偏移量,我得到“分段错误”或“非法指令”。 尽pipe两个案件都结束了。 “核心倾销”。 我认为这是因为我混淆了“相对地址”(注:我对Linux很新,所以我远远没有掌握GDB)。 如代码中所述,取决于sizeof(jmpOp) (在第66行),我得到一个非法指令或分段错误。 我很抱歉,如果这是明显的事情,我熬夜太晚了… // Header files #include <stdio.h> #include <sys/mman.h> #include <unistd.h> #include "global.h" // Contains typedefines for byte, ulong, ushort etc… #include <cstring> bool ProtectMemory(void * addr, int flags) { // Constant holding the page size value const size_t pageSize = sysconf(_SC_PAGE_SIZE); // Calculate relative […]

ELF程序头虚拟地址和文件偏移量

我知道两者之间的关系: 虚拟地址mod页面alignment==文件偏移mod页面alignment 但有人能告诉我这两个数字在哪个方向计算吗? 根据上述关系计算文件偏移量的虚拟地址,反之亦然? 更新 这里有一些细节:当链接器写ELF文件头时,它设置程序头的虚拟地址和文件偏移量(段) 例如有readelf -l someELFfile的输出readelf -l someELFfile : Elf file type is EXEC (Executable file) Entry point 0x8048094 Program Headers: Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align LOAD 0x000000 0x08048000 0x08048000 0x00154 0x00154 RE 0x1000 LOAD 0x000154 0x08049154 0x08049154 0x00004 0x00004 RW 0x1000 GNU_STACK 0x000000 0x00000000 0x00000000 0x00000 0x00000 RW […]