标签: libc

Android libc版本和malloc实现

Android平台使用什么libc实现?使用哪种malloc实现(ptmalloc或tcmalloc或其他任何东西)?

malloc android libc bionic

2
推荐指数
1
解决办法
4950
查看次数

寻找math.h函数的纯c版本(没有协处理器支持)

我必须使用静态验证C源的一些(半)自动验证软件(CBMC (链接)).支持浮点,但没有所有数学函数的定义.尝试检查是否可以用它来检查数字软件.

所以我需要这些功能.我在找一些math.h没有协处理器使用的定义(例如sqrt,pow,其余部分tan; int/ float/ double).

当我在一些Linux发行版附带的libc(也许现在是eglibc)中查找它时,我总是达到一个点,其中有一些处理器内在函数意味着硬件sqrt函数.

第1部分:搜索软件实现

我需要的是一个支持数学函数的库,具有以下特征:

  • 支持IEEE浮点数,但纯粹基于整数运行的库也会很棒,也许更好.
  • 正确性是一个关键因素.(隐藏在某些来源的特殊情况的已知错误并不那么酷).根据IEEE-754(例如sqrt的规则),结果也应该是正确的.
  • 不使用协处理器调用.纯软件.C是首选,但asm也应该没问题.

到目前为止,我搜索了各种libc实现,特别是有关嵌入式系统的实现.我认为这些库中的大多数都是针对编译程序的可移植性和大小,但很难说它们是否使用特定于处理器的指令.

  • **fdlibm乍一看似乎有一些纯软件定义.我会进一步检查.但是在源代码中提到了一些错误(代码不是标准的).
  • **newlib似乎带来了相同的定义(基于sun microsystems的代码).但是我现在不能肯定地说这些软件版本是否总是被使用,所以可能会有一些我目前看不到的协处理器调用(参见第2部分).
  • **uClibc似乎与newlib共享特征.

第2部分:了解这些实现的结构

  • 有人能给我一些关于这些数学库结构的简短介绍.他们如何调度各种版本(例如特定的协处理器)?

  • 这些不同前缀在文件名中的含义是什么?e_sqrt.c,k_sin,s_sin

我会很高兴听到一些图书馆这可能是对我有用.我宁愿选择一个库,但是当它有必要时,也可以寻找一些单一的函数实现并构建一个小型库.我不会使用math.h中定义的所有函数.

这个这个 SO帖子都说Java Math Implementation是基于fdlibm的,这听起来这个库是可行的.有关这个库的更多信息的人我应该知道吗?

似乎我有很多可能性,包括以下两个:

  1. 使用glibc并在软件模式下编译.问题是,我不能使用任何自动系统检查工具(在configure中).我必须手动提供所有信息.是否有任何标志禁止使用fp-coprocessor并禁止simd操作?fp-without应该是一个开头,然后如果编译它也使用soft-float.我希望编译过程或多或少依赖于主机的特定决策(如arm ......).
  2. 使用fdlibm(目前首选).问题:如何将程序链接到它?我需要像assert这样的非libm函数,但想要链接我的fdlibm而不是安装的system-libm(所以-nodefaultlibs将禁止使用assert).

c libc math.h uclibc newlib

2
推荐指数
1
解决办法
1550
查看次数

将newlib移植到自定义ARM设置

这是我的第一篇文章,它涵盖了我一直想要开发和关闭一年的东西.

基本上它归结为以下内容:我有一个newlib的副本,我正在尝试使用LPC2388(来自NXP的ARM7TDMI).这是在使用arm-elf-gcc的linux机器上

我的问题是我一直在看很多关于移植newlib的教程,他们都谈论了存根(如exit,open,read/write,sbrk),我对它有很好的了解如何实现所有这些功能.但是我应该把它们放在哪里

我有来自sources.redhat.com/pub/newlib/newlib-1.18.0.tar.gz的newlib发行版,在我找到"syscalls.c"之后(在newlib-1.18.0/newlib/libc/sys /中)手臂),它包含了所有我必须更新存根的,但是他们都填满了,而查看完代码(它似乎没有crt0.s中,其本身并不与我的工作芯片)的工作.

我应该自己消灭这些功能,然后重新编写它们吗?或者我应该把它们写在别的地方.我应该使用我的"架构"的名称在newlib/libc/sys中创建一个全新的文件夹并更改目标以匹配吗?

我也很好奇,如果在将它作为一个开源项目发布之后有适当的礼节分配这样的东西.我目前有一个下载binutils,arm-elf-gcc,newlib和gdb的脚本,并编译它们.如果我正在修改newlib目录中的文件,我应该提交一个我的脚本自动应用的补丁吗?或者我应该将修改后的newlib添加到存储库中吗?

谢谢你好好阅读!接下来是对我正在做的更详细的细分.


对于那些想要/需要有关我的设置的更多信息的人:

我正在基于Uzebox项目(http://belogic.com/uzebox/)松散地构建一个ARM视频游戏控制台.

当我试图弄明白时,我已经从各种不同的资源中做了各种各样的事情.你可以在这里阅读我的冒险开始(sparkfun论坛,没有人回应,因为我自己解决):forum.sparkfun.com/viewtopic.php?f = 11&t = 22072

我通过阅读有关移植newlib的Stackoverflow问题并查看了一些不同的教程(如wiki.osdev.org/Porting_Newlib),但他们也告诉我实现存根而不提及哪里,谁,什么,何时或如何!

embedded libc newlib arm7

2
推荐指数
1
解决办法
2834
查看次数

libc如何工作?

我正在编写一个MIPS32仿真器,并希望在使用gcc编译C程序时可以使用整个标准C库(可能使用GNU扩展).

据我所知,I/O由MIPS32架构上的系统调用处理.要使用libc/glibc成功运行程序,如何判断我需要模拟哪些系统调用?(没有反复试验)

编辑:请参阅示例,了解syscalls的含义.

(如果您有兴趣,可以在这里查看项目,欢迎任何反馈.请记住,它处于非常早期的阶段)

c c++ emulation libc mips32

2
推荐指数
1
解决办法
1031
查看次数

qsort和bsearch指针数组

我需要排序一个指向struc的指针数组.实际上,我需要在地址之间进行搜索,以查看数组中是否存在指向结构的指定指针.不幸的是,我在这些结构中没有任何"可比性"的东西,所以我只想按地址排序.我的代码是这样的:

item* arr[SIZE];
//something is inserted
qsort(arr, SIZE, sizeof(item*), (void*)compare_funct); 
//CUT
bsearch(curr, arr, SIZE, sizeof(item*), (void*)compare_funct);
Run Code Online (Sandbox Code Playgroud)

我尝试创建一个compare_funct,只是将指针转换为int并返回它们的区别,但它似乎不起作用.特别是,当我进行bsearch时,即使我知道元素包含在数组中,我总是得到一个NULL作为返回值.

c libc qsort bsearch

2
推荐指数
1
解决办法
1692
查看次数

char*str ="..."vs char str [] ="......"奇怪的行为

可能重复:
尝试设置char数组的字符时程序崩溃

我有一个示例代码,按预期工作:

/* strtok example */
#include <stdio.h>
#include <string.h>

int main ()
{
  char str[] ="- This, a sample string.";
  char * pch;
  printf ("Splitting string \"%s\" into tokens:\n",str);
  pch = strtok (str," ,.-");
/*
  while (pch != NULL)
  {
    printf ("%s\n",pch);
    pch = strtok (NULL, " ,.-");
  }
*/
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

...除非我将char str []更改为char*str,它不应该在语义上产生任何差异:

/* strtok example */
#include <stdio.h>
#include <string.h>

int main ()
{
  char * str ="- This, a sample string.";
  char * …
Run Code Online (Sandbox Code Playgroud)

c gcc g++ libc

2
推荐指数
2
解决办法
1179
查看次数

rand()不返回随机值

它是一个生成随机厄米特矩阵厄米特矩阵的小代码.

我在每次调用rand()之前调用了srand().但输出中仍然没有随机性.

我使用c99的复杂数据类型功能来创建一个埃尔米特矩阵.我不确定我错在哪里:(

#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 = MATSIZE; j != i ; j--) 
    { 
       mat[i][j] = real + img * I;
       mat[j][i] = conj(mat[i][j]);
    }
    srand(time(NULL));
    if(i == j)
      mat[i][i] = rand()%RAND_RANGE + …
Run Code Online (Sandbox Code Playgroud)

c linux gcc matrix libc

2
推荐指数
2
解决办法
1376
查看次数

无法在gdb中打印errno,抱怨缺少共享库,但它存在

在调试我的应用程序时,如果我在GDB中断并尝试打印errno,甚至从检查errno的函数内部,我从GDB获得以下错误:

(gdb) print errno
Cannot find shared library `/usr/lib/debug/lib/libc-2.11.1.so' in dynamic linker's load module list
Run Code Online (Sandbox Code Playgroud)

我试过的事情:

  1. 检查文件是否存在,确实存在并且大约是7.3MB.
  2. 将/ usr/lib/debug/lib /添加到LD_LIBRARY_PATH的前面.没有效果.
  3. 设置LD_PRELOAD =/usr/lib/debug/lib/libc-2.11.1.so会导致我的应用程序在启动时出现段错误.
  4. 如果我对二进制运行LDD它说,它使用"/lib/libc.so.6"和资质(我运行Ubuntu)告诉我的libc6-DBG 安装.
  5. 检查我没有在.gdbinit中设置自定义lib路径,我没有.

该应用程序似乎运行正常,所以我无法想象libc本身搞砸了.有任何想法吗?

ubuntu gdb errno shared-libraries libc

2
推荐指数
1
解决办法
3527
查看次数

启动原子文本编辑器linux!#.找不到GLIBC_2.14和GLIBC_2.15?

我正在使用crunnchbang linux 64位.我安装了原子文本编辑器,但是当我尝试启动它时它给出了错误.输出如下:

shunya@crunchbang:~$ atom 
shunya@crunchbang:~$ /usr/share/atom/atom: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.14' not found (required by /usr/share/atom/atom)
/usr/share/atom/atom: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.14' not found (required by /usr/share/atom/libchromiumcontent.so)
/usr/share/atom/atom: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.14' not found (required by /usr/share/atom/libgcrypt.so.11)
/usr/share/atom/atom: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.15' not found (required by /usr/share/atom/libgcrypt.so.11)
Run Code Online (Sandbox Code Playgroud)

从输出中可以清楚地看到它需要一些名为GLIBC_2.5和2.14的软件包.我该如何安装这些要求?我试图搜索突触包管理器,如果我搜索GLIBC有很长的包列表.我无法分辨要安装哪一个.

但是一旦我做了GLIBC_2.14或-2.14,就没有剩下的选择了.

*更新:尝试

sudo apt-get install libc6 
Run Code Online (Sandbox Code Playgroud)

我得到输出,因为libc6已经是最新版本了.

debian dependencies glibc libc atom-editor

2
推荐指数
1
解决办法
1万
查看次数

ftell(FILE*fd)和lseek(int fd,off_t offset,int whence)的结果之间的差异

考虑这个代码示例:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main()
{
    //this file exists and contains data: "ABCDEFGHIJKLM"
    FILE* file = fopen("file.txt", "r");
    char data[4];
    long int pos = ftell(file);
    fseek(file, 0, SEEK_SET);
    fread(data, 4, 1, file);
    fseek(file, pos, SEEK_SET);

    printf("ftell: %d\n", ftell(file));
    printf("lseek: %d\n", lseek(fileno(file), 0, SEEK_CUR));

    fread(data, 1, 4, file);

    //this correctly prints A
    //but external function needs fileno(file) that has wrong pos
    printf("%c\n", data[0]);

    fclose(file);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

该计划的结果令人惊讶:

ftell: 0
lseek: 14
A
Run Code Online (Sandbox Code Playgroud)

我正在尝试修复我的应用程序中的错误,但我确定前一段时间此程序的结果应该是0, 0(换句话说,从来没有在我的应用程序中出现此错误). …

c glibc libc

2
推荐指数
1
解决办法
770
查看次数