我越来越
***glibc检测到***(/ my/program/...):malloc():内存损坏:0xf28000fa***
我在valgrind下运行,它报告了读取已被释放的内存的情况,但没有非法内存写入的情况.
读取释放的内存会导致内存损坏吗?如果没有,除了valgrind输出之外还有哪些建议?
我可以fprintf(stderr)在glibc/linux的信号(SIGALRM)处理程序中使用吗?
我想为了学习目的对glibc做一些修改.但是,我想保持原始gcc设置不变.换句话说,对于通常的编译,我想使用当前在我的系统中的glibc,但对于某些程序,我想用我自己修改的glibc链接我的程序.如何为此目的编写Makefile?
我试图从PHP执行shell命令将文件转换为PDF格式但我得到此错误.
有人可以详细解释我如何解决它吗?
我在linux上不太好(
如果我直接通过终端执行命令一切正常.
/usr/lib/libreoffice/program/oosplash: /opt/lampp/lib/libstdc++.so.6:
version `GLIBCXX_3.4.9' not found
(required by /usr/lib/libreoffice/program/../ure-link/lib/libuno_sal.so.3)
Run Code Online (Sandbox Code Playgroud) 考虑这个代码示例:
#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(换句话说,从来没有在我的应用程序中出现此错误). …
我一直在阅读系统调用及其在Linux中的工作方式.我仍然有更多的阅读要做,但有一件事,我已经读过的没有回答的是,为什么我们需要系统调用?
我知道系统调用是来自用户空间程序的请求,内核要做一些事情,但我的问题基本上是:为什么用户空间程序不能自己做呢?为什么Glibc不执行实际操作而不仅仅是作为系统调用的包装器?
例如,如果我调用fopen()我的程序,为什么glibc会调用open系统调用?为什么glibc本身不进行操作?
我明白这意味着glibc开发人员会有更多的工作,他们必须对Linux有一个深入的了解,但是glibc与Linux内核的关系是否已经非常密切了?
另外,我知道系统调用函数在CPU的0环上运行......但是真正重点是什么呢?如果我执行一个程序,我给它明确的运行权限,那么通过分离哪些代码可以在不同的上下文中运行来添加什么安全性,因为你还是给了它所有权限?
我尝试编译以下代码(最小例子,请参阅整个代码的编辑):
// a.c
#include <stdio.h>
#define _XOPEN_SOURCE
#include <unistd.h>
int main(int argc, char* argv[])
{
puts((const char*) crypt("AAAA", "$6$2222"));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
使用clang-7 -lcrypt a.c并发出以下警告:
minimum.c:8:24: warning: implicit declaration of function 'crypt' is invalid in C99 [-Wimplicit-function-declaration]
puts((const char*) crypt("AAAA", "$6$2222"));
^
minimum.c:8:10: warning: cast to 'const char *' from smaller integer type 'int' [-Wint-to-pointer-cast]
puts((const char*) crypt("AAAA", "$6$2222"));
^
2 warnings generated.
Run Code Online (Sandbox Code Playgroud)
但./a.out似乎确实有效:
$6$2222$6GKY4KPtBqD9jAhwxIZGDqEShaBaw.pkyJxjvSlKmtygDXKQ2Q62CPY98MPIZbz2h6iMCgLTVEYplzp.naYLz1
Run Code Online (Sandbox Code Playgroud)
我发现如果我删除#include <stdio.h>并puts喜欢这个:
// new_a.c
#define _XOPEN_SOURCE
#include …Run Code Online (Sandbox Code Playgroud) 我想使用gdb的记录,但是因为glibc的ld.so使用xsave指令,所以出现错误“进程记录不支持地址0x7ffff7fe883c的指令0xfae64”。
多亏了stackoverflow的回答,我才能用二进制补丁修复类似的错误。运行半小时后,使用调试符号编译glibc失败,因此,如果有更快的解决方案,我将感到高兴。我从这里获得了一个编译版本,但似乎没有提供任何早期版本(即,我现在使用的是glibc 2.28.r502.g065957a3704-1和gdb 8.2.1)。如何使gdb录制工作?
我试图找到__builtin_va_start在GCC源代码中定义的位置,并查看其实现方式。(我一直在寻找va_start定义的位置,然后发现该宏定义为__builtin_va_start。)我cscope -r在GCC 9.1的源代码目录中使用它来搜索定义,但没有找到它。谁能指出该函数的定义位置?