Linux如何同时32位和64位?或者是glibc处理的东西?
我运行CentOS 5.3,它是一个"64位"版本; 虽然我为64位和32位构建了东西.据我所知,Windows应该有一个32位模拟器.Linux做同样的事情吗?它是在用户空间还是内核空间?
如果libc处理它,它有点像模拟器说,我将链接32位应用程序,但说64位到内核?
根据Wikipedia,有许多基于操作系统和编译器的标准C库变体.参考:http://en.wikipedia.org/wiki/C_standard_library
但我想了解在单个库中定义了在不同标头中声明的大量函数(例如:stdio.h,string.h,stdlib.h等).所有这些头文件的源代码文件是否相同,或者stdio.h,string.h等有不同的库?由于我是编程的初学者,我不知道多个源代码文件是否可以生成像可执行文件这样的单个库.如果可能,那么我可以理解libc包含所有标准头文件的定义.我在哪里可以看到标准C库的源代码?
它是静态库还是动态库?如果我的环境(OS/IDE)中存在两个版本,当我在源代码中包含任何标准头文件时,会将其链接起来.它依赖于IDE吗?但是对于gcc,程序员没有明确地包含libc.
libc是标准C库的标准名称吗?
在Windows操作系统/环境中它是否已经存在?如果它存在,它的名称是什么(仅限libc)?
还有像libm这样的其他标准C库吗?
尝试运行一个简单的nanomsg文件,从第一个开始:https://github.com/dysinger/nanomsg-examples
安装nanomsg到/usr/local/lib/nanomsg-0.2-alpha.然sudo ./configure,sudo make check,sudo make install并sudo 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) 在研究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字节的内存.为什么允许这样做?我开始寻找并发现访问数组越界有多危险?
例如,这证实了它绝对不是一件好事,未分配的内存可能未被映射.然而,必须有一些东西使这项工作.我的一些假设:
究竟是什么原因?
编辑:刚刚找到为什么我获得了未分配内存的读写权限?,这似乎表明我的第一个猜测是正确的.
编辑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) 例如,如果我想覆盖malloc(),那么最好的方法是什么?
目前我所知道的最简单的方法是:
malloc.h所
#include <stdlib.h>
#define malloc my_malloc
void* my_malloc (size_t size);
Run Code Online (Sandbox Code Playgroud)
foobar.c但是
#include "malloc.h"
void foobar(void)
{
void* leak = malloc(1024);
}
Run Code Online (Sandbox Code Playgroud)
这种方法的问题是我们现在必须使用"malloc.h"并且永远不能使用"stdlib.h".有没有解决的办法?我特别感兴趣的是导入第三方库而不修改它们,但是强迫它们调用我的自定义libc函数(比如malloc).
我有一个使用CMake构建的C / C ++项目。在尝试编译静态二进制文件时,我GLIBC在计算机和目标计算机上遇到了不同版本的问题。在关于SO的另一个问题中,对类似问题的公认答案是使用libc的替代实现,例如musl或uClibc。(请参阅此处)
我找不到有关如何指向cmake使用此类替代libc的任何信息。FindMusl.cmake文件既没有寄出,也无法在互联网上找到。简单使用CC=/usr/bin/musl-gcc是行不通的。
如何将我的cmake项目与此类替代libc实现静态链接,使其独立于GLIBC?
我正在尝试测试我的代码部分的效率,而C++有一个clock功能ctime,允许使用该clock_t类型测量程序所消耗的处理器时间.是否有一些Rust等价物不仅仅是测量代码中两点之间的绝对时间?
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)
便携.
我有libc6与libc6-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 程序中可以进行系统调用吗?考虑一下:
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)
在此示例代码中,open、write、 和close是库函数。在我的搜索过程中,我得出的结论是它们是函数而不是系统调用。这些函数(open、write和close)中的每一个都会进行系统调用。
问题
write和系统调用,而如果我们使用不同的选项编译它,则它会调用库函数?read