标签: libc

linux如何同时32位和64位?或者是glibc处理的东西?

Linux如何同时32位和64位?或者是glibc处理的东西?

我运行CentOS 5.3,它是一个"64位"版本; 虽然我为64位和32位构建了东西.据我所知,Windows应该有一个32位模拟器.Linux做同样的事情吗?它是在用户空间还是内核空间?

如果libc处理它,它有点像模拟器说,我将链接32位应用程序,但说64位到内核?

linux 64-bit x86 libc 32bit-64bit

6
推荐指数
1
解决办法
2872
查看次数

什么是libc?它包含哪些功能?我们怎样才能得到它的源代码?

根据Wikipedia,有许多基于操作系统和编译器的标准C库变体.参考:http://en.wikipedia.org/wiki/C_standard_library

  1. 但我想了解在单个库中定义了在不同标头中声明的大量函数(例如:stdio.h,string.h,stdlib.h等).所有这些头文件的源代码文件是否相同,或者stdio.h,string.h等有不同的库?由于我是编程的初学者,我不知道多个源代码文件是否可以生成像可执行文件这样的单个库.如果可能,那么我可以理解libc包含所有标准头文件的定义.我在哪里可以看到标准C库的源代码?

  2. 它是静态库还是动态库?如果我的环境(OS/IDE)中存在两个版本,当我在源代码中包含任何标准头文件时,会将其链接起来.它依赖于IDE吗?但是对于gcc,程序员没有明确地包含libc.

  3. libc是标准C库的标准名称吗?

  4. 在Windows操作系统/环境中它是否已经存在?如果它存在,它的名称是什么(仅限libc)?

  5. 还有像libm这样的其他标准C库吗?

c standards libc standard-library libm

6
推荐指数
1
解决办法
1253
查看次数

libc.h:编译nanomsg管道样本时没有这样的文件或目录

尝试运行一个简单的nanomsg文件,从第一个开始:https://github.com/dysinger/nanomsg-examples

安装nanomsg到/usr/local/lib/nanomsg-0.2-alpha.然sudo ./configure,sudo make check,sudo make installsudo ldconfig作为指导说.所有测试都通过.

当我运行它时,说找不到libc.h:

$ gcc pipeline.c /usr/local/lib/libnanomsg.a -o pipeline
pipeline.c:2:18: fatal error: libc.h: No such file or directory
compilation terminated.
Run Code Online (Sandbox Code Playgroud)

什么是libc.h?我从大学开始就没有做任何C编程.它是nanomsg或C库的一部分吗?

$ which gcc
/usr/bin/gcc
Ubuntu 12.04.4 LTS
Run Code Online (Sandbox Code Playgroud)

c libc nanomsg

6
推荐指数
1
解决办法
4947
查看次数

矢量化的strlen逃脱阅读未分配的记忆

在研究OSX 10.9.4的strlen实现时,我注意到它总是比较一个16字节的块并向前跳过到接下来的16个字节,直到它遇到'\0''.相关部分:

3de0:   48 83 c7 10             add    $0x10,%rdi
3de4:   66 0f ef c0             pxor   %xmm0,%xmm0
3de8:   66 0f 74 07             pcmpeqb (%rdi),%xmm0
3dec:   66 0f d7 f0             pmovmskb %xmm0,%esi
3df0:   85 f6                   test   %esi,%esi
3df2:   74 ec                   je     3de0 <__platform_strlen+0x40>
Run Code Online (Sandbox Code Playgroud)

0x10 十六进制是16个字节.

当我看到它时,我想知道:这个记忆也可以不被分配.如果我已经分配了一个20字节的C字符串并将其传递给strlen它,它将读取36字节的内存.为什么允许这样做?我开始寻找并发现访问数组越界有多危险?

例如,这证实了它绝对不是一件好事,未分配的内存可能未被映射.然而,必须有一些东西使这项工作.我的一些假设:

  • OSX不仅保证其分配是16字节对齐的,而且还保证分配的"量子"是16字节的块.换句话说,分配5个字节实际上将分配16个字节.分配20个字节实际上将分配32个字节.
  • 当你编写asm时读取数组的结尾本身并没有坏处,因为它不是未定义的行为,只要它在界限内(在页面内?).

究竟是什么原因?

编辑:刚刚找到为什么我获得了未分配内存的读写权限?,这似乎表明我的第一个猜测是正确的.

编辑2:愚蠢的是,我已经忘记了尽管Apple似乎已经删除了大多数asm实现的源代码(OSX的x86-64汇编libc例程在哪里?),但是它留下了strlen:http://www.opensource .apple.com /源极/ libc的/ libc的-997.90.3/x86_64的/串/ strlen.s

在评论中我们发现:

//  returns the length of the string s (i.e. the …
Run Code Online (Sandbox Code Playgroud)

c macos assembly memory-management libc

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

如何覆盖标准的libc函数?

例如,如果我想覆盖malloc(),那么最好的方法是什么?

目前我所知道的最简单的方法是:

malloc.h所

#include <stdlib.h>
#define malloc my_malloc
void* my_malloc (size_t size);
Run Code Online (Sandbox Code Playgroud)

foob​​ar.c但是

#include "malloc.h"

void foobar(void)
{
    void* leak = malloc(1024);
}
Run Code Online (Sandbox Code Playgroud)

这种方法的问题是我们现在必须使用"malloc.h"并且永远不能使用"stdlib.h".有没有解决的办法?我特别感兴趣的是导入第三方库而不修改它们,但是强迫它们调用我的自定义libc函数(比如malloc).

c malloc overriding libc

6
推荐指数
1
解决办法
7072
查看次数

在cmake项目中使用替代libc

我有一个使用CMake构建的C / C ++项目。在尝试编译静态二进制文件时,我GLIBC在计算机和目标计算机上遇到了不同版本的问题。在关于SO的另一个问题中,对类似问题的公认答案是使用libc的替代实现,例如musluClibc。(请参阅此处

我找不到有关如何指向cmake使用此类替代libc的任何信息。FindMusl.cmake文件既没有寄出,也无法在互联网上找到。简单使用CC=/usr/bin/musl-gcc是行不通的。

如何将我的cmake项目与此类替代libc实现静态链接,使其独立于GLIBC?

c++ cmake libc uclibc musl

6
推荐指数
1
解决办法
2272
查看次数

是否有一个与C++中的时钟函数相当的Rust?

我正在尝试测试我的代码部分的效率,而C++有一个clock功能ctime,允许使用该clock_t类型测量程序所消耗的处理器时间.是否有一些Rust等价物不仅仅是测量代码中两点之间的绝对时间?

libc rust

6
推荐指数
1
解决办法
628
查看次数

dev_t和ino_t是否必须是整数类型?

glibc的文档保持它们是整数类型(不比unsigned int窄),但我找不到标准引用,它说它们必须是整数类型(另请参见time_t).

所以最后,问题变成:是

#include <stdio.h>
#include <stdint.h>
struct stat st;

if (stat("somefile", &st) == 0) {
        printf("%ju %ju\n", (uintmax_t)st.st_dev, (uintmax_t)st.st_ino);
}
Run Code Online (Sandbox Code Playgroud)

便携.

c standards posix libc

6
推荐指数
1
解决办法
459
查看次数

为什么gdb无法找到../sysdeps/unix/sysv/linux/ifaddrs.c

我有libc6libc6-dbg安装。

(gdb) b
reak freeifaddrs
(gdb) run
Breakpoint 1, __freeifaddrs (ifa=0xa822e0) at ../sysdeps/unix/sysv/linux/ifaddrs.c:840
840 ../sysdeps/unix/sysv/linux/ifaddrs.c: No such file or directory.
(gdb) list
835 in ../sysdeps/unix/sysv/linux/ifaddrs.c
(gdb) disassemble
Dump of assembler code for function __freeifaddrs:
=> 0x00007ffff7912fd0 <+0>: jmpq   0x7ffff780f8a8
End of assembler dump.

(gdb) where
#0  __freeifaddrs (ifa=0xa822e0) at ../sysdeps/unix/sysv/linux/ifaddrs.c:840
Run Code Online (Sandbox Code Playgroud)

但是,gdb拒绝获取有关ifaddrs.c的任何信息,尽管它知道它位于第840行

这里发生了什么?

c linux gdb libc

6
推荐指数
1
解决办法
3083
查看次数

C 程序中可以进行系统调用吗?

C 程序中可以进行系统调用吗?考虑一下:

int main()
{
    int f = open("/tmp/test.txt", O_CREAT | O_RDWR, 0666);
    write(f, "hello world", 11);
    close(f);

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

在此示例代码中,openwrite、 和close是库函数。在我的搜索过程中,我得出的结论是它们是函数而不是系统调用。这些函数(openwriteclose)中的每一个都会进行系统调用。

问题

  • 我的结论首先正确吗?
  • C 程序中可以进行系统调用吗?
  • 如果系统调用可以在 C 程序中发生,那么它们什么时候发生?请举个例子。
  • 是否可以通过编译选项来控制使用库函数与直接进行系统调用?例如,我们是否可以使用一些选项编译上面的程序,以便直接进行write和系统调用,而如果我们使用不同的选项编译它,则它会调用库函数?read

c function libc system-calls

6
推荐指数
1
解决办法
2196
查看次数