标签: libc

我是否需要担心Valgrind报告我的申请范围之外的错误?

在运行Valgrind的memcheck工具时,我经常会得到数十万(或更多,因为Valgrind切断100K)的小的无效读取语句,例如:

==32027== Invalid read of size 1
==32027==    at 0x3AB426E26A: _IO_default_xsputn (in /lib64/libc-2.5.so)
==32027==    by 0x3AB426CF70: _IO_file_xsputn@@GLIBC_2.2.5 (in /lib64/libc-2.5.so)
==32027==    by 0x3AB42621FA: fwrite (in /lib64/libc-2.5.so)
==32027==    by 0x4018CA: STARCH_gzip_deflate (in /home/areynolds/trunk/utility/applications/bed/starch/bin/starch)
==32027==    by 0x401F48: compressFileWithGzip (in /home/areynolds/trunk/utility/applications/bed/starch/bin/starch)
==32027==    by 0x4028B5: transformInput (in /home/areynolds/trunk/utility/applications/bed/starch/bin/starch)
==32027==    by 0x402F12: main (in /home/areynolds/trunk/utility/applications/bed/starch/bin/starch)
==32027==  Address 0x7febb9b3c is on thread 1's stack
Run Code Online (Sandbox Code Playgroud)

这些语句指的是对我的应用程序之外的函数(" starch")的调用,它们似乎是其中的一部分libc.这是我需要关注的吗?

编辑

如果我修改fwrite调用以删除一个字节,那么我的gzip流会被破坏.这是原始代码:

int STARCH_gzip_deflate(FILE *source, FILE *dest, int level) {                                                                                                                                                                                                              

    int ret, flush;                                                                                                                                                                                                                                                         
    unsigned …
Run Code Online (Sandbox Code Playgroud)

c linux valgrind libc

4
推荐指数
1
解决办法
1229
查看次数

libc如何提供两个名称的函数?

在直接绑定(-B direct)出现之前,libc提供了许多具有两个名称的函数.例如,getpwent()和_getpwent().这两个名称在libc中引用了完全相同的功能.

libc如何使两个函数名指向同一个实现?

我认为这不应该像写两次相同的代码那么容易.

c libc

4
推荐指数
1
解决办法
881
查看次数

编写一个返回libc攻击,但libc在内存中加载到0x00

我正在为我的系统安全类编写一个返回libc攻击.首先,易受攻击的代码:

//vuln.c
#include <stdio.h>
#include <stdlib.h>

int loadconfig(void){
  char buf[1024];
  sprintf(buf, "%s/.config", getenv("HOME"));
  return 0;
}

int main(int argc, char **argv){
  loadconfig();
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

我想使用返回libc攻击.编译和调试程序:

$ gcc -g -fno-stack-protector -o vuln vuln.c
$ gdb vuln
(gdb) break loadconfig
(gdb) run
Reached breakpoint blah blah blah.
(gdb) p $ebp
$1 = (void *) 0xbfffefb0
(gdb) p system
$2 = {<text variable, no debug info>} 0x0016db20 <system>
(gdb) p exit
$3 = {<text variable, no debug info>} 0x001639e0 <exit>
(gdb) x/2000s …
Run Code Online (Sandbox Code Playgroud)

c exploit libc buffer-overflow

4
推荐指数
1
解决办法
4305
查看次数

valgrind抱怨__mktime - 这是我的错吗?

这是第一次(在我的新开发环境中)我看到valgrind抱怨mktime,但我不确定这是否是libc库,valgrind或我的代码中的错误.我将从错误(下面)开始 - 这是否足以解释原因?

==3682==    at 0x38ACE9A505: __mktime_internal (in /lib64/libc-2.12.so)
==3682==    by 0x4D66F7: ???
==3682==    by 0x4D7611: ???
==3682==    by 0x4D23CD: ???
==3682==    by 0x4D175B: ???
==3682==    by 0x38ACE1ECDC: (below main) (in /lib64/libc-2.12.so)
==3682==  Uninitialised value was created by a stack allocation
==3682==    at 0x4D64BE: ???
==3682== 
==3682== Conditional jump or move depends on uninitialised value(s)
==3682==    at 0x38ACE9A505: __mktime_internal (in /lib64/libc-2.12.so)
==3682==    by 0x4D67DA: ???
==3682==    by 0x4D7611: ???
==3682==    by 0x4D23CD: ???
==3682==    by 0x4D175B: ???
==3682==    by 0x38ACE1ECDC: …
Run Code Online (Sandbox Code Playgroud)

valgrind libc mktime

4
推荐指数
1
解决办法
1268
查看次数

libc函数“ strcpy()”是否调用任何系统调用?

我想知道是否有不调用任何syscall()的libc函数?例如,对于libc函数“ strcpy()”,是否需要任何syscall调用(让我们考虑所有可能的linux系统)。

posix libc system-calls strcpy

4
推荐指数
1
解决办法
516
查看次数

是否有链接器标志强制它在启动时加载所有共享库?

是否有一个标志或任何其他指令可用于强制Linux动态链接器ld.so在程序启动时立即加载所有共享库而不是延迟绑定.

基本上我想关闭延迟绑定.

谢谢

linux compiler-construction linker libc ld

4
推荐指数
1
解决办法
2792
查看次数

这可能与printf有关吗?

据我所知,使用超大字符串,您可以打印出前几个字符:

printf(".5s\n",string);
Run Code Online (Sandbox Code Playgroud)

并且使用小尺寸字符串,您可以用空格填充它:

printf("% 5s\n",string);
Run Code Online (Sandbox Code Playgroud)

有没有办法同时实现这两个目标?即如果它很短,请用0或空格填充它,如果它很长则截断它?

c printf libc

4
推荐指数
1
解决办法
123
查看次数

将Rust与C链接:对'__aeabi'函数的未定义引用

我正在一个在嵌入式设备上使用Rust的项目上进行工作,在这里我试图在Rust中编写可以从C调用的函数。我在没有标准库的情况下编译了该项目,或多或少地遵循了本教程:Embedded Rust Right现在!

我的Rust代码可以很好地编译为.o文件,但是在尝试使用arm-none-eabi-ld将C和Rust对象文件链接在一起时遇到了麻烦。我收到类似以下错误:

rustfunc.o: In function `func':
rustfunc.0.rs:(.text.hash+0x18): undefined reference to `__aeabi_memclr8'
...
/rust/src/libcore/slice.rs:1446: undefined reference to `__aeabi_memcpy'
/rust/src/libcore/fmt/num.rs:196: undefined reference to `__aeabi_memclr4'
Run Code Online (Sandbox Code Playgroud)

最让我困惑的是,即使我只是将目标文件链接在一起,但这些错误同时引用了我的Rust代码和libcore中的代码。

是否有人知道这些错误是什么意思,以及链接器为何无法解决这些问题?谢谢!

c gcc libc rust eabi

4
推荐指数
1
解决办法
2200
查看次数

Synology DSM6 - libc.so.6 - 无法识别文件格式

我的最终目标是使用DSM 6.0.1-7393 Update 1在我的Synology DiskStation DS1813 +上安装Nagios.但我甚至无法开始编译软件包......

当我尝试在Synology DiskStation上使用gcc时,我总是收到以下错误消息:

$ gcc hello.c -o hello.o
/lib/libc.so.6: file not recognized: File format not recognized
collect2: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)

这是我的shell环境.我已尝试使用不同的LD_LIBRARY_PATH设置,但即使省略它也没有什么区别.

$ env
TERM=xterm-256color
SHELL=/bin/sh
SSH_CLIENT=192.168.2.110 51079 22
OLDPWD=/var/services/homes/egi
SSH_TTY=/dev/pts/7
LC_ALL=en_US.utf8
USER=egi
LD_LIBRARY_PATH=/opt/lib:
PAGER=more
MAIL=/var/mail/egi
PATH=/opt/sbin:/opt/bin:/sbin:/bin:/usr/sbin:/usr/bin
PWD=/var/services/homes/egi/exer
LANG=en_US.utf8
PS1=[\u@\h \W]$ 
SHLVL=1
HOME=/var/services/homes/egi
TERMINFO=/usr/share/terminfo
LOGNAME=shunyam
SSH_CONNECTION=xxx.xxx.xxx.xxx 51079 yyy.yyy.yyy.yyy 22
PGDATA=/var/services/pgsql
CC=gcc
_=/opt/bin/env
Run Code Online (Sandbox Code Playgroud)

编译器已经安装了ipkg,其规格如下所示:

$ gcc --verbose
Using built-in specs.
Target: i686-linux-gnu
Configured with: ../gcc-4.2.1/configure --build=i386-pc-linux-gnu --host=i686-linux-gnu --target=i686-linux-gnu --prefix=/opt --disable-nls …
Run Code Online (Sandbox Code Playgroud)

gcc libc synology

4
推荐指数
1
解决办法
2594
查看次数

libc包含不遵守源类型参数更改的防护

如果我包含time.h,请更改“源类型参数”并重新包含该标头,它是否不应该在这些新定义中添加?我了解这是由于包括警卫而发生的。我的问题是:这是libc中的错误吗?它不应该能够处理吗?

#include <time.h>
#define _XOPEN_SOURCE 600
#include <time.h>

static struct timespec t;
Run Code Online (Sandbox Code Playgroud)

错误信息:

example.c:5:24: error: storage size of ‘t’ isn’t known
    5 | static struct timespec t;
      |                        ^
Run Code Online (Sandbox Code Playgroud)

背景

我发现这种行为在使用编译时构建了Python扩展-std=c99。如果在包含标准库之前包含标准库,Python.h由于缺少POSIX功能的定义,将会出现编译错误。如果我将Python.hinclude 放在所有其他内容之前,那么一切都很好。当然也可以进行编译-std=gnu99。但是我想深入了解为什么发生错误,并将其提炼为上述代码示例。

这就引出了另一个问题。如果上述行为不是错误,那么_XOPEN_SOURCE在标头中设置和类似的源类型参数是否被视为不良做法?Python是否应该在其标头中删除该参数的设置,而是要求用户在编译期间进行定义或使用std=gnu99

c libc

4
推荐指数
1
解决办法
51
查看次数