Articles of libc

Python的ctypes从Linux上的libc调用reboot()

我试图通过ctypes从Python中的libc调用rebootfunction,我只是不能得到它的工作。 我一直在引用man 2 reboot页面( http://linux.die.net/man/2/reboot )。 我的内核版本是2.6.35。 下面是来自交互式Python提示符的控制台日志,我试图让我的机器重启 – 我做错了什么? 为什么不是ctypes.get_errno()工作? >>> from ctypes import CDLL, get_errno >>> libc = CDLL('libc.so.6') >>> libc.reboot(0xfee1dead, 537993216, 0x1234567, 0) -1 >>> get_errno() 0 >>> libc.reboot(0xfee1dead, 537993216, 0x1234567) -1 >>> get_errno() 0 >>> from ctypes import c_uint32 >>> libc.reboot(c_uint32(0xfee1dead), c_uint32(672274793), c_uint32(0x1234567), c_uint32(0)) -1 >>> get_errno() 0 >>> libc.reboot(c_uint32(0xfee1dead), c_uint32(672274793), […]

在clang ++和libc ++上的std :: cerr会导致SIGABRT

我试图得到一个简单的程序运行在Ubuntu 12.04 x64编译与铿锵+ + 3.3的libc + + + +的libc ++阿比。 程序: #include <iostream> int main(int argc, char **argv) { try { std::cerr << "Test cerr \n"; } catch (…) { std::cout << "catch exception"; } return 0; } 写入std :: cerr会打印该消息,但会导致SIGABRT。 但是,写入到std :: cout工作正常。 这里的可执行文件的ldd输出: $ldd cerr_test linux-vdso.so.1 => (0x00007fffce5ff000) libc++abi.so.1 => /usr/local/lib/libc++abi.so.1 (0x00007fa4079fd000) libc++.so.1 […]

返回到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 […]

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

在Linux上primefaces交换两个文件的内容

我有两个文件, A和B ,每个都有自己的内容。 我想交换这两个文件,所以A会变成B ,而B会变成A 但是我想要保证没有任何其他进程会发现这两个文件处于不一致的状态,即使是很短的一段时间,任何进程都不会find这些文件中的任何一个。 所以,作为一个副业,我也想保证,如果在操作过程中出现什么问题,什么都不会改变(就像我猜想的那种交易)。 在OS X上有一个exchangedata()函数,所以我想我在找一个相当于Linux的东西,或者至less是一个等价的做primefaces文件交换的方法。

移动到不同的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 […]

在Android上安装预构build二进制文件:“not found”

我试图在一个自定义的Android图像中安装一个预编译的二进制文件。 为此,我已经将它复制到prebuilt/android-arm/目录下的一个新目录中,并使用类似下面的Android.mk文件: LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_SRC_FILES := binary_name LOCAL_MODULE := binary_name LOCAL_MODULE_CLASS := EXECUTABLES include $(BUILD_PREBUILT) 因此,如果我运行make system_image binary_name ,则二进制文件将被复制到系统映像中的/bin/ 。 如果我运行模拟器,我可以在/system/bin看到二进制文件。 权限与其他可执行文件( -rwxr-xr-x )相同,根据file ,这是一个ARM二进制文件( ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (uses shared libs), stripped )。 但是当我在模拟器上运行它时,它说: # binary_name binary_name: not found 我已经把它,这是我可以看到: # strace binary_name execve("/system/bin/binary_name", […]

如何睡几个微秒

考虑下面的代码: #include <stdio.h> #include <time.h> #include <math.h> // Compile with gcc -lrt -lm -o test_clock test_clock.c #define CLOCK CLOCK_MONOTONIC int main(int argc, char** argv) { double temp, elapsed; int j; struct timespec requestStart, requestEnd, req; // Pseudo-sleep clock_gettime(CLOCK, &requestStart); temp = 0; for(j=0; j < 40; j++) temp += sin(j); clock_gettime(CLOCK, &requestEnd); elapsed = ( […]

在Linux上为clang构buildlibc ++的方法是什么?

编辑/更新/注意:只要让clang使用libstdc ++。 到目前为止,我一直在为我工作得很好。 =============================== 在过去,我可以通过cmake做些事情,但是刚才我在http://llvm.org/svn/llvm-project/libcxx/trunk项目树的lib目录中发现了一个buildit脚本。 这个buildit脚本似乎不使用libsupc++ ,这是我以前使用的cmake方法。 例如, 本指南显示了一个cmake咒语来为libc++生成一个makefile文件,该文件将能够处理编译和安装。 我的问题是生成LLVM- libc++这些不同的方法和应该使用哪一个的区别是什么? 他们会有不同的performance吗? buildit脚本似乎没有提供任何安装帮助。 有没有方向如何正确安装图书馆? 用我之前用cmake构build的libc ++,我必须总是在链接器标志(和-L的path)中添加-lc++ ,这在我的OS X makefiles中是不必要的。

用mmap重叠页面(MAP_FIXED)

由于与这个问题无关的一些模糊的原因,我需要求助于使用MAP_FIXED来获得一个页面,这个页面接近libc的文本部分在内存中的位置。 在阅读mmap(2)(本来应该做的)之前,如果我使用MAP_FIXED调用mmap,并且基地址与已经映射的区域重叠,那么我期望得到一个错误。 但事实并非如此。 例如,这里是某个进程的/ proc / maps的一部分 7ffff7299000-7ffff744c000 r-xp 00000000 08:05 654098 /lib/x86_64-linux-gnu/libc-2.15.so 其中,进行以下mmap调用后… mmap(0x7ffff731b000, getpagesize(), PROT_READ | PROT_WRITE | PROT_EXEC, MAP_ANONYMOUS | MAP_PRIVATE | MAP_FIXED, 0, 0); … 变成: 7ffff7299000-7ffff731b000 r-xp 00000000 08:05 654098 /lib/x86_64-linux-gnu/libc-2.15.so 7ffff731b000-7ffff731c000 rwxp 00000000 00:00 0 7ffff731c000-7ffff744c000 r-xp 00083000 08:05 654098 /lib/x86_64-linux-gnu/libc-2.15.so 这意味着我已经用自己的页面覆盖了专用于libc的虚拟地址空间的一部分。 显然不是我想要的… 在mmap(2)手册的MAP_FIXED部分中,它明确指出: 如果由addr和len指定的内存区域与任何现有映射的页面重叠,则现有映射的重叠部分将被丢弃 。 这解释了我所看到的,但我有几个问题: 有没有办法来检测是否已经映射到某个地址? 没有访问/ […]