Articles of libc

在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指定的内存区域与任何现有映射的页面重叠,则现有映射的重叠部分将被丢弃 。 这解释了我所看到的,但我有几个问题: 有没有办法来检测是否已经映射到某个地址? 没有访问/ […]

虽然给出了'-lrt',但是没有定义对'clock_gettime'的引用

我已经将-lrt作为编译器的最后一个链接器标志。 但仍然得到这个错误。 arif@khost:~/sak/sak.exosip$ gcc eXo_init.c -I/opt/osip2/include -I/opt/exosip/include -L/opt/osip2/lib -L/opt/exosip/lib -leXosip2 -losipparser2 -losip2 -lrt /opt/osip2/lib/libosip2.so: undefined reference to `clock_gettime' collect2: ld returned 1 exit status 手册页说: NAME clock_getres, clock_gettime, clock_settime – clock and time functions SYNOPSIS #include <time.h> int clock_getres(clockid_t clk_id, struct timespec *res); int clock_gettime(clockid_t clk_id, struct timespec *tp); int clock_settime(clockid_t clk_id, const struct timespec […]

Linux函数获取挂载点

在标准的Linux库中是否有一个函数(或接口; ioctl,netlink等),它将直接从内核返回当前挂载而不parsing/ proc? strace的安装命令,它看起来像分析/ proc中的文件

malloc / free是一个由libc提供的系统调用或库例程吗?

如果malloc / free在libc中作为库例程实现,那么它是在sbrk系统调用还是mmap系统调用之上实现的,还是其他的? 而一般来说,在sys / syscall.h中声明的函数是否包含目标机器中的所有系统调用?

我需要一个来自glibc的asynchronous信号安全函数列表

非系统调用的包装,但像snprintf(),dprintf()

如何在Linux上重新实现(或包装)系统调用函数?

假设我想完全接pipeopen()系统调用,也许包装实际的系统调用并执行一些日志logging。 一种方法是使用LD_PRELOAD来加载一个(用户自制的)共享对象库,它接pipeopen()入口点。 用户自制的open()例程然后通过dlsym()获取指向glibc函数open()的指针并调用它。 上面提出的解决scheme是一个dynamic解决scheme,但是。 假设我想静态链接自己的open()包装器。 我该怎么做? 我猜这个机制是一样的,但我也猜测在用户定义的open()和libc open()之间会有符号冲突。 请分享其他技术来实现相同的目标。

为什么msvcrt(非常非常慢)?

我具体询问旧的msvcrt.dll 。 没有Microsoft更新该库在较新版本的Windows中? 或者是在Windows 98发行版中可以find的完全相同的库? 我用一个testing程序对Cygwin进行了msvcrttesting,通过一个带有互斥锁和信号量的单链表阻塞队列,很多次调用了malloc 。 通过ifdef s,程序可以被编译为使用Posix函数或者使用Windows API调用。 当由WinGUI编译MinGW时,调用唯一的依赖项是kernel32.dll , ntdll.dll和msvcrt.dll ,而当由Cygwin用Posix函数编译时,程序将依赖于cygwin1.dll 。 我起初只是假设Cygwin版本将运行较慢,因为Posix函数的额外仿真层; 它必须将它们转换成WinAPI调用。 但是看起来,它比MinGW编译的本机二进制文件在我的机器上运行速度快了四倍。 Cygwin的文档声明它使用了一个名为newlib的不同的libc,当然Cygwin编译的二进制文件似乎不依赖于msvcrt。 那么这是否会造成巨大的速度差异呢? 我也曾经经历过,当一个C程序调用数百万个malloc ,取决于msvcrt.dll运行速度比任何其他运行速度慢许多倍,这取决于新的msvcrXX.dll 。 他们甚至比运行在虚拟机linux下的相同程序跑得慢。 什么是msvcrt.dll错误? 我应该尽可能避免吗?