这个问题与为什么 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 …
根据文档:
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) 我有一个使用 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 驱动程序?因为符号似乎在那里,所以即使在 …
我在互联网上搜索并看到很多使用itoa()函数的代码,他们声称这个函数在stdlib.h中
我现在正在使用2个版本的GCC:
(GCC)4.2.4(Ubuntu 4.2.4-1ubuntu4))
(GCC)4.1.2 20080704(Red Hat 4.1.2-44)
并且它们都没有itoa()函数(我编译程序和错误:对'itoa'的未定义引用).
有任何想法吗?谢谢.
memmove并没有真正移动内存不对吗?它只是将内存从一个区域复制到另一个区域,并允许这两个区域重叠.我问这个问题是因为我只是想知道为什么这个fnc以非常误导的方式被调用.
因为我明白当某个东西从一个地方移动到另一个地方时,"东西"就是在另一个地方而不是第一个地方之后.而memmove它不会那样工作.我对吗?
我试图找到信息,我没有在clang网站上看到它.我正在考虑尝试在Windows上使用它,但我不知道它是否拥有它自己的libc或者它使用来自MS的破解libc?
另一个问题:如果我使用clang编译代码,我是否可以使用visual studio作为调试器,例如clang能够以MS格式发出调试符号(这是我不想使用gcc的原因;这是英特尔编译器可以做的事情,但它使用MS的libc).
简而言之,我希望能够使用visual studio作为调试器,但我同时需要具有正常lib c的正常实际编译器.
或者,也许还有商业选择.我读过dinkum为Win32和其他人出售商业libc,但我不知道价格是多少以及如何获得它.
现代系统:
% 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) 我需要追踪double sin(double x)eglibc-2.13中究竟是如何实现的.我下载了源代码,唯一有意义的部分是__sin函数,这是特定于平台的.它是我在/usr/lib/i386-linux-gnu/libm.a中所拥有的核心吗?
如何追踪从sin()到__sin()的宏定义?我真正需要的是确切的代码(文件名和行就足够了)以及构建过程推断使用哪种实现的方式.该架构的i386.
我的系统errno定义为:
int * __error(void);
#define errno (* __error())
Run Code Online (Sandbox Code Playgroud)
我理解errno是一个宏并扩展到* __error()功能:
我到处搜索(我的系统上的源代码),但我找不到__error()函数的定义,有人可以显示/解释它的定义是什么/应该是什么?
表达式如何errno = 0与上面的定义一起使用(分配0给函数?)?是errno = 0扩展到* __error() = 0?
谢谢
所以,今天我编写了一些单元测试,突然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)