我正在检查 ac 程序的错误并想安装 valgrind,然后系统告诉我我还应该安装带有调试符号 libc6-dbg 的 libc6。
现在我的问题是,当我以后用 gcc 编译时,会使用哪个版本的 libc?
我如何选择我正在编译的 libc6?
我不是在问如何安装它,我在 ubuntu 上,所以 apt-get install libc6-dbg 可以解决问题。
我试图找出errno何时发生变化.
起初,我在gdb中尝试了"watch errno",这导致了错误
Cannot find thread-local variables on this target
Run Code Online (Sandbox Code Playgroud)
我能够通过编译"-pthread"来解决这个问题.但是,它仍然不起作用,我现在得到错误
Cannot find shared library `/usr/lib/debug/lib/x86_64-linux-gnu/libc-2.13.so' in dynamic linker's load module list
Run Code Online (Sandbox Code Playgroud)
当我输入"watch errno"时.我需要做什么才能在errno上设置观察点?
我知道这听起来有点主观,但我想在C中实现基本的库函数,以便在C中获得更好的理解(主要是在指针中)并提高我的技能,因为我只是一个初学者(在C和编程中) ).
我发现它很有用,因为你可以更好地了解幕后发生的事情以及这些基本功能的工作原理.
我可以实现哪些基本的C库函数?我在寻找简单的像strcpy,atoi,strstr是不是太复杂(我只是一个初学者),但仍需要一些思考.
我在学习strtok函数的代码从BSD的libc中,当我在我的机器上运行它,程序接收到的信号SIGSEGV中s[-1] = 0.这是代码的链接.
是s[-1] = 0吧?
这是我的代码:
#include <stdio.h>
#include <stdlib.h>
#include "strtok.c"
int main(int argc, char* argv[]) {
char* str = "xxxx xxxyy fdffd";
const char* s = " ";
char* token = strtok(str, s);
while (token != NULL) {
printf("%s\n", token);
token = strtok(NULL, s);
}
return 0;
}
Run Code Online (Sandbox Code Playgroud) 为什么不能重新编译GLibc关闭所有优化(即-O0)?
特别是这样做:
make CFLAGS='-O0 -w' CXXFLAGS='-O0 -w'
Run Code Online (Sandbox Code Playgroud)
我明白了:
#error "glibc cannot be compiled without optimization"
Run Code Online (Sandbox Code Playgroud) 如果gcc编译的程序正在调用dlopen,则必须在启用-ldl选项的情况下编译它.这意味着这样的程序依赖于库libdl.so上的运行时.事实上,通过对它执行ldd,我们看到了这一行:
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2
Run Code Online (Sandbox Code Playgroud)
libc.so反过来使用dlopen(例如,处理libnss.so),但是没有出现在libldl.so上执行ldd:
/lib64/ld-linux-x86-64.so.2 (0x00007f5a488e4000)
linux-vdso.so.1 => (0x00007fff7bdfe000)
Run Code Online (Sandbox Code Playgroud)
为何如此区别?
(注意:这不是一个重复的问题)
我正在使用 libc 函数tmpnam,并收到以下警告:
warning: the use of 'tmpnam' is dangerous, better use 'mkstemp'
Run Code Online (Sandbox Code Playgroud)
我的问题不是“如何禁用警告”,而是“我应该使用什么功能”?mkstemp没有帮助,因为我没有尝试创建临时文件 - 我正在创建一个临时目录。而且 AFAIK,没有用于此的 API 函数。
所以,如果我不应该使用tmpnam什么我我应该用?
来自Linux编程接口:
使用setlocale()设置语言环境有两种不同的方法.locale参数可以是一个字符串,指定系统上定义的一个语言环境(即/ usr/lib/locale下的一个子目录的名称),例如de_DE或en_US.或者,可以将语言环境指定为空字符串,这意味着应该从环境变量中获取语言环境设置:
setlocale(LC_ALL,"");
我们必须进行此调用,以便程序能够识别语言环境变量.如果省略调用,则这些环境变量对程序没有影响.
所以,按我的understaning,如果我的程序不调用setlocale明确的功能,我的程序会使用默认的locale,这是POSIX在*nix系统中,对不对?我无法搜索指定的文档.
在 x86-64 Ubuntu 上使用 NASMundefined reference to _printf构建定义自己_start而不是的汇编程序时,我得到了一个main
构建命令:
nasm -f elf64 hello.asm
ld -s -o hello hello.o
hello.o: In function `_start':
hello.asm:(.text+0x1a): undefined reference to `_printf'
MakeFile:4: recipe for target 'compile' failed
make: *** [compile] Error 1
Run Code Online (Sandbox Code Playgroud)
nasm 来源:
extern _printf
section .text
global _start
_start:
mov rdi, format ; argument #1
mov rsi, message ; argument #2
mov rax, 0
call _printf ; call printf
mov rax, 0
ret ; return 0
section …Run Code Online (Sandbox Code Playgroud) 我知道 Rust 中的 libc crate 包含许多在 Rust 中使用的 C 标准宏和函数,但它也声明它不关心系统之间的可移植性。我正在将一些大量使用 C 的预处理器宏的代码从 C 移植到 Rust,并且仅在定义了给定宏的情况下才包含一些代码:在这种情况下O_BINARY. 是否可以检查O_BINARY宏是否在我的系统上用 Rust 定义,如果是,它看起来像什么?
我正在寻找一种可以相当紧密地复制此 C 语法的构造:
#ifdef O_BINARY
// Some extra code here
#endif
// Regular code
Run Code Online (Sandbox Code Playgroud)