标签: libc

如何查看libc版本?

这个问题与为什么 pclose 提前返回有关?。我想知道libc交叉编译的可执行文件使用的是哪个版本。如下所述,存在一些限制,使得检查特定 gcc 编译器的 glibc 版本中的答案不适用。

  • 检查libc版本的一种建议方法是使用gnu_get_libc_version()中声明的函数gnu/libc-version.h。我的跨工具链不包括libc-version.h.

  • 另一个建议的解决方案是使用该-print-file-name gcc选项。链接问题中的这个答案完全不适合我:

$ /path/to/toolchains/ARM-cortex-m3-4.4/bin/arm-uclinuxeabi-gcc -print-file-name=libc.so
libc.so
$
$ /path/to/toolchains/ARM-cortex-m3-4.4/bin/arm-uclinuxeabi-gcc -print-file-name=foo.bar
foo.bar
$ # I really do not have a foo.bar file in existence
Run Code Online (Sandbox Code Playgroud)
  • 另一个建议的解决方案是直接执行ldd --version. 我的目标平台没有ldd
$ ldd
sh: can't execute 'ldd': No such file or directory
Run Code Online (Sandbox Code Playgroud)
  • 另一个建议的解决方案是查看__GLIBC____GLIBC_MINOR__- 但这些似乎也来自libc-version.h,它不存在于我的跨工具链中,如上所述。

我的跨工具链似乎只提供libc.a,而不提供libc.so
我尝试运行它libc.a …

c libc cross-compiling

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

为什么 `CMSG_SPACE` 不是 Rust 中的常量函数?

根据文档

pub const unsafe extern "C" fn CMSG_SPACE(length: c_uint) -> c_uint
Run Code Online (Sandbox Code Playgroud)

但是,如果我编译

fn main() {
    let _ = [0u8; libc::CMSG_SPACE(1) as usize];
}
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

error[E0015]: calls in constants are limited to constant functions, tuple structs and tuple variants
 --> src/bin/libc-const.rs:2:27
  |
2 |     let _ = [0u8; unsafe {libc::CMSG_SPACE(1) as usize}];
  |                           ^^^^^^^^^^^^^^^^^^^

For more information about this error, try `rustc --explain E0015`.
Run Code Online (Sandbox Code Playgroud)

libc compile-time-constant rust

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

libc 和未定义的符号:stime

我有一个使用 FTDI 驱动程序库的 python 应用程序,名为:

/usr/local/lib64/libftd2xx.so.1.4.22
Run Code Online (Sandbox Code Playgroud)

当我使用 libc 2.27 运行该应用程序时,它工作正常。

当针对 libc 2.32 运行它时,它会失败并显示以下内容:

/usr/local/lib64/libftd2xx.so: undefined symbol: stime
Run Code Online (Sandbox Code Playgroud)

在查看 libc 版本时,确实有一些与 libc 2.31 中的 stime 相关的内容,如下所述: https: //lwn.net/Articles/811315/

它说:

“过时的函数 stime 不再可用于新链接的二进制文件,并且其声明已从 <time.h> 中删除。”

我对此的理解是,只有“新代码”无法编译/链接此函数,但使用此函数的现有库应该仍然可以工作。

事实上,如果我在 2.27 和 2.32 中查找 stime 符号,大致使用以下命令,我会发现 stime 就在那里:

2.27

root@PPL23:~# nm --demangle --dynamic --defined-only --extern-only /lib/x86_64-linux-gnu/libc-2.27.so* | grep stime
00000000000d5ee0 T stime
Run Code Online (Sandbox Code Playgroud)

2.32

localhost /tmp #  nm --demangle --dynamic --defined-only --extern-only /lib64/libc-2.32.so | grep stime
000000000012e490 T stime@GLIBC_2.2.5
Run Code Online (Sandbox Code Playgroud)

为什么 libc 2.32 不向后兼容现有的 FTDI 驱动程序?因为符号似乎在那里,所以即使在 …

glibc libc

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

Stdlib itoa功能

我在互联网上搜索并看到很多使用itoa()函数的代码,他们声称这个函数在stdlib.h中

我现在正在使用2个版本的GCC:

  1. (GCC)4.2.4(Ubuntu 4.2.4-1ubuntu4))

  2. (GCC)4.1.2 20080704(Red Hat 4.1.2-44)

并且它们都没有itoa()函数(我编译程序和错误:对'itoa'的未定义引用).

有任何想法吗?谢谢.

c standards libc

3
推荐指数
1
解决办法
2693
查看次数

memmove不动

memmove并没有真正移动内存不对吗?它只是将内存从一个区域复制到另一个区域,并允许这两个区域重叠.我问这个问题是因为我只是想知道为什么这个fnc以非常误导的方式被调用.
因为我明白当某个东西从一个地方移动到另一个地方时,"东西"就是在另一个地方而不是第一个地方之后.而memmove它不会那样工作.我对吗?

c c++ memory libc

3
推荐指数
3
解决办法
1300
查看次数

CLang libc,Windows上的libc ++,带有与Visual Studio兼容的调试符号

我试图找到信息,我没有在clang网站上看到它.我正在考虑尝试在Windows上使用它,但我不知道它是否拥有它自己的libc或者它使用来自MS的破解libc?

另一个问题:如果我使用clang编译代码,我是否可以使用visual studio作为调试器,例如clang能够以MS格式发出调试符号(这是我不想使用gcc的原因;这是英特尔编译器可以做的事情,但它使用MS的libc).

简而言之,我希望能够使用visual studio作为调试器,但我同时需要具有正常lib c的正常实际编译器.

或者,也许还有商业选择.我读过dinkum为Win32和其他人出售商业libc,但我不知道价格是多少以及如何获得它.

libc llvm clang visual-studio

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

流程的退出状态如何取决于它是否是静态构建的?

现代系统:

% pacman -Q glibc gcc
glibc 2.16.0-4
gcc 4.7.1-6
% uname -sr
Linux 3.5.4-1-ARCH
Run Code Online (Sandbox Code Playgroud)

一个简单的程序:

% < wtf.c   
void main(){}
Run Code Online (Sandbox Code Playgroud)

让我们做静态和动态构建:

% gcc -o wtfs wtf.c -static                               
% gcc -o wtfd wtf.c
Run Code Online (Sandbox Code Playgroud)

一切都很好:

% file wtf?                                             
wtfd: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=0x4b421af13d6b3ccb6213b8580e4a7b072b6c7c3e, not stripped
wtfs: ELF 64-bit LSB executable, x86-64, version 1 (GNU/Linux), statically linked, for GNU/Linux 2.6.32, BuildID[sha1]=0x1f2a9beebc0025026b89a06525eec5623315c267, not stripped
Run Code Online (Sandbox Code Playgroud)

有人可以向我解释一下吗?

% for n in $(seq …
Run Code Online (Sandbox Code Playgroud)

c gcc libc dynamic-linking static-linking

3
推荐指数
1
解决办法
92
查看次数

如何在eglibc-2.13中实现sin()?

我需要追踪double sin(double x)eglibc-2.13中究竟是如何实现的.我下载了源代码,唯一有意义的部分是__sin函数,这是特定于平台的.它是我在/usr/lib/i386-linux-gnu/libm.a中所拥有的核心吗?

如何追踪从sin()到__sin()的宏定义?我真正需要的是确切的代码(文件名和行就足够了)以及构建过程推断使用哪种实现的方式.该架构的i386.

c linux math glibc libc

3
推荐指数
1
解决办法
750
查看次数

了解C errno

我的系统errno定义为:

int *    __error(void);
#define errno    (* __error())
Run Code Online (Sandbox Code Playgroud)

我理解errno是一个宏并扩展到* __error()功能:

  1. 我到处搜索(我的系统上的源代码),但我找不到__error()函数的定义,有人可以显示/解释它的定义是什么/应该是什么?

  2. 表达式如何errno = 0与上面的定义一起使用(分配0给函数?)?是errno = 0扩展到* __error() = 0

谢谢

c libc

3
推荐指数
1
解决办法
1057
查看次数

G ++不允许我定义名为"major"的成员函数

所以,今天我编写了一些单元测试,突然G ++给了我一个关于GNU C和我的一个成员函数的意外警告major.为什么我不能在major没有触发G ++的情况下命名成员函数?

这是一个最低限度可行的测试片段:

// Any of these includes trigger the warnings
#include <random>
#include <cstdlib>

class my_class {
public:
    void major() const;
};

inline void my_class::major() const {}

int main(void) {
    my_class my_obj;
    my_obj.major();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这是编译的输出(使用g++ --std=c++14 -o test-gcc-major test-gcc-major.cpp):

[flisboac@sonic ~]$ uname -a && lsb_release -a && g++ -v && g++ --std=c++14 -o test-gcc-major test-gcc-major.cpp && ./test-gcc-major 
Linux sonic 4.12.10-1-ARCH #1 SMP PREEMPT Wed Aug 30 12:18:42 CEST 2017 …
Run Code Online (Sandbox Code Playgroud)

c++ g++ libc libstdc++ gcc-warning

3
推荐指数
1
解决办法
211
查看次数