所以我正在浏览linux glibc源代码,但我看不到它实际上做了什么.以下是来自io/chdir.c但它表明了许多源文件.这里发生了什么?显然我错过了一些东西.秘诀是什么,它在哪里进行系统调用或实际执行某些操作?
stub_warning是一些遗留的疯狂. __set_errno似乎是一个简单的宏设置errno.虽然我发现一百万用法,但weak_alias我没有看到它在任何地方定义.
是否有一个有用的指南来了解glibc如何在某处工作?
#include <errno.h>
#include <stddef.h>
#include <unistd.h>
/* Change the current directory to PATH. */
int
__chdir (path)
const char *path;
{
if (path == NULL)
{
__set_errno (EINVAL);
return -1;
}
__set_errno (ENOSYS);
return -1;
}
stub_warning (chdir)
weak_alias (__chdir, chdir)
#include <stub-tag.h>
Run Code Online (Sandbox Code Playgroud) 下载并编译了glibc-2.13.当我尝试运行一个执行malloc()的示例C程序时.我得到以下错误
elf file OS ABI invalid
任何人都可以通过我的任何指针帮助解决这个问题.请注意我的内核版本是linux-2.6.35.9
在标准库(glibc)中,我看到使用前导双下划线定义的函数,例如__mmapin sys/mman.h.什么目的?我们怎样才能调用一个mmap似乎没有在任何地方声明的函数.我的意思是我们包括sys/mman.h,但sys/mman.h没有声明mmap,它只声明__mmap.
我已经构建了glibc 2.14并将其安装在目录中~/GLIBC/glibc_install.现在我想使用这个C库而不是系统的默认C库来构建和运行程序.
为了确保我使用的是自定义glibc,我添加了一个put glibc/stdio-common/printf.c:__printf来打印消息的调用.
然后我重建并重新安装了glibc.
然后我写了一个"Hello,World"程序并尝试编译并链接如下:
gcc -nodefaultlibs -static -lgcc -L~/GLIBC/glibc_install/lib -o myprog myprog.c
Run Code Online (Sandbox Code Playgroud)但是我得到以下链接器错误报告:
/usr/lib/gcc/x86_64-linux-gnu/4.4.3/../../../../lib/crt1.o: In function `_start':
(.text+0x19): undefined reference to `__libc_csu_init'
/usr/lib/gcc/x86_64-linux-gnu/4.4.3/../../../../lib/crt1.o: In function `_start':
(.text+0x25): undefined reference to `__libc_start_main'
/tmp/ccACTQEp.o: In function `main':
c1.c:(.text+0xa): undefined reference to `puts'
collect2: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?
在我们的服务器中,符号链接libc.so.6已被删除.现在系统中的二进制文件都没有工作.为了解决这个问题,我尝试了:
/bin/ln -s /lib/libc-2.11.3.so /lib/libc.so.6
Run Code Online (Sandbox Code Playgroud)
正如所料,这给了我:
/bin/ln: error while loading shared libraries: libc.so.6:
cannot open shared object file: No such file or directory
Run Code Online (Sandbox Code Playgroud)
我也尝试过:
/lib/ld-linux-x86-64.so.2 --inhibit-rpath /lib/libc.so.6 \
--library-path /lib/libc-2.11.3.so \
/bin/ln -s /lib/libc-2.11.3.so /lib/libc.so.6
Run Code Online (Sandbox Code Playgroud)
结果相同.进一步不成功的尝试包括cp,mv,cat.
我通过ssh连接,我相信在关闭这个会话后我将无法打开另一个会话.有没有办法修复这个系统(也许使用bash内置函数)?
[ 编辑 ]我做了:
while read line; do echo $line; done < /lib/libc-2.11.3.so > libc.so.6
Run Code Online (Sandbox Code Playgroud)
复制文件并尝试使用:
/lib/ld-linux-x86-64.so.2 --inhibit-rpath libc.so.6 --library-path . \
/bin/ln -s /lib/libc-2.11.3.so /lib/libc.so.6
Run Code Online (Sandbox Code Playgroud)
得到了:
/bin/ln: error while loading shared libraries: ./libc.so.6: ELF file OS ABI invalid
Run Code Online (Sandbox Code Playgroud) 我发现有些人和像图书这样的参考文献表明,如果p != NULL和p来自之前的分配(例如by malloc),则realloc(p, 0)相当于free(p)GNU/Linux.为了支持这一论点,man realloc完全以这种方式陈述(强调我的前进):
realloc()函数将ptr指向的内存块的大小更改为size字节.内容将在从区域开始到新旧尺寸的最小范围内保持不变.如果新大小大于旧大小,则不会初始化添加的内存.如果ptr为NULL,则对于所有size值,调用等效于malloc(size); 如果size等于零,并且ptr不为NULL,则该调用等效于free(ptr).除非ptr为NULL,否则必须由之前调用malloc(),calloc()或realloc()返回.如果指向的区域被移动,则完成自由(ptr).
正如您在此问题中所发现的那样,C标准没有准确定义应该发生什么,实际行为是实现定义的.进一步来说:
C11§7.22.3/ p1 内存管理功能说:
如果请求的空间大小为零,则行为是实现定义的:返回空指针,或者行为就像大小是非零值一样,但返回的指针不应用于访问对象.
和C11§7.22.3.5realloc 函数包含:
3)(...)如果无法分配新对象的内存,则不会释放旧对象,并且其值不变.
4)该
realloc函数返回指向新对象的指针(可能与指向旧对象的指针具有相同的值),如果无法分配新对象,则返回空指针.
我写了一些基本代码mcheck,通过内存检查器的帮助找出实际行为,提供了glibc:
#include <mcheck.h>
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int a = 5;
int *p, *q;
mtrace();
p = malloc(sizeof(int));
q = &a;
printf("%p\n", (void *) p);
printf("%p\n", (void *) …Run Code Online (Sandbox Code Playgroud) 我有一个使用mmap系统调用的应用程序,我有一个问题,让它编译几个小时,看看为什么我得到MAP_ANON和MAP_ANONYMOUS未声明,我有一个较小的代码部分,我用过,我看到我可以编译它就好了,所以我尝试了一个基本的编译,这工作,我看到它添加-std = c99失败.是否有特定原因导致MAP_ANON和MAP_ANONYMOUS在C99标准中无效?我知道它们不是由POSIX定义的,而是由BSD SOURCE定义的,所以我只想知道为什么会这样.
考虑一种算法来测试在特定次数的尝试之后从一组N个唯一数字中挑选某个数字的概率(例如,N = 2,轮盘中的概率是什么(没有0),它需要X尝试黑赢?)
对此的正确分布是pow(1-1/N,X-1)*(1/N).
但是,当我使用以下代码对其进行测试时,在X = 31处始终存在深沟,独立于N,并且独立于种子.
这是一个内在的缺陷,由于PRNG的实施细节在使用中无法防止,这是一个真正的错误,还是我忽略了一些明显的东西?
// C
#include <sys/times.h>
#include <math.h>
#include <stdio.h>
int array[101];
void main(){
int nsamples=10000000;
double breakVal,diffVal;
int i,cnt;
// seed, but doesn't change anything
struct tms time;
srandom(times(&time));
// sample
for(i=0;i<nsamples;i++){
cnt=1;
do{
if((random()%36)==0) // break if 0 is chosen
break;
cnt++;
}while(cnt<100);
array[cnt]++;
}
// show distribution
for(i=1;i<100;i++){
breakVal=array[i]/(double)nsamples; // normalize
diffVal=breakVal-pow(1-1/36.,i-1)*1/36.; // difference to expected value
printf("%d %.12g %.12g\n",i,breakVal,diffVal);
}
}
Run Code Online (Sandbox Code Playgroud)
使用libc6软件包2.15-0ubuntu20和Intel Core i5-2500 SandyBridge测试了最新的Xubuntu 12.10,但几年前我在一台较旧的Ubuntu机器上发现了这一点.
我也在Windows 7上使用Unity3D/Mono进行了测试(虽然不确定哪个Mono版本),这里使用System.Random时,X = 55时沟渠发生,而Unity内置的Unity.Random没有可见的沟渠(至少没有)对于X …
我不知道如何在CentOS 6.3上将glibc从版本2.12升级到2.14.我需要你的帮助.
有人能指出我strlen()在海湾合作委员会的定义吗?我现在大约半小时一直在试用版本4.4.2(当谷歌疯狂时),我似乎无法找到strlen()实际实现的位置.