所以每个人都可能知道glibc /lib/libc.so.6可以在shell中执行,就像普通的可执行文件一样,在这种情况下它可以打印出版本信息并退出.这是通过在.so中定义入口点来完成的.对于某些情况,将其用于其他项目可能会很有趣.不幸的是,您可以通过ld的-e选项设置的低级入口点有点太低级:动态加载器不可用,因此您无法调用任何正确的库函数.因此,glibc通过此入口点中的裸系统调用实现write()系统调用.
我现在的问题是,任何人都可以想到一个很好的方法,如何从该入口点引导一个完整的动态链接器,以便可以访问其他.so的函数?
标准C库实现,特别是glibc(GNU C库)提供链表,堆栈等.数据结构,还是我们必须自己滚动?
谢谢.
我的系统上安装了两个gcc编译器,一个是gcc 4.1.2(默认),另一个是gcc 4.4.4.我如何检查所使用的libc版本gcc 4.4.4,因为它/lib/libc.so.6显示了所使用的glibc gcc 4.1.2,因为它是默认的编译器.
名为_GLIBCXX_USE_NANOSLEEP的预处理器宏出现在两个标准头文件中:
在GCC 4.7.1(Linux,64位)的默认构建中,c ++ config.h包含的唯一内容是此注释:
/* Defined if nanosleep is available. */
/* #undef _GLIBCXX_USE_NANOSLEEP */
Run Code Online (Sandbox Code Playgroud)
而在线程中,定义std::this_thread::sleep_for()和std::this_thread::sleep_until()依赖于要定义的宏.如果没有定义,那么两个函数 - 尽管C++标准都要求 - 也不会被定义.
在我的系统(glibc 2.15)上,虽然nanosleep()函数(声明在ctime)存在并且可操作,但未定义宏.
我想知道这是什么以及如何处理它.特别:
nanosleep()函数和宏之间真的存在关联吗?nanosleep()in ctime/ 的声明time.h似乎不依赖于或定义宏.-D在命令行中作为选项(如相关问题中的建议)是否存在任何特定风险?如果我在一个nanosleep()不可用的系统上执行此操作会怎么样?我该如何找到它?从GCC 4.8开始更新std::this_thread::sleep_for(),libstdc ++中会自动包含支持等.不再需要配置标志.从GCC 4.8更改日志:
this_thread :: sleep_for(),this_thread :: sleep_until()和this_thread :: yield()的定义不需要配置选项--enable-libstdcxx-time; …
我已成功安装了Tensorflow绑定和python.但是当我尝试导入Tensorflow时,我得到了以下错误.
ImportError: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.17' not found (required by /usr/local/lib/python2.7/dist-packages/tensorflow/python/_pywrap_tensorflow.so)
Run Code Online (Sandbox Code Playgroud)
我试图将GLIBC_2.15更新为2.17,但没有运气.
我刚刚阅读 glibcsscanf 手册页(来自 Linux 手册页包),发现了以下内容:
\n\n可以使用以下转换说明符:
\n
\n(...)\n
d\xc2\xa0\xc2\xa0 已弃用。匹配一个可选的有符号十进制整数;\nnext 指针必须是指向 的指针int。\n
i\xc2\xa0\xc2\xa0 已弃用。匹配一个可选的有符号整数;next\n指针必须是指向 的指针int。如果整数以 或 开头,则以 16 为基数读取0x;0X如果以 开头,则以 8 为基数读取0;否则以 10 为基数读取。仅使用与\n基数相对应的字符。\n
o\xc2\xa0\xc2\xa0 已弃用。匹配无符号八进制整数;下一个指针\n必须是指向 的指针unsigned int。(...)
\n
%d被废弃了呢?似乎所有int说明符都已弃用。如果我在我的机器上编译C++程序,并在另一台机器上运行它(使用较旧的软件),我得到:/usr/lib/libstdc++.so.6: version `GLIBCXX_3.4.9' not found.
实际上在我的系统上glibc更新(我得到了gcc-libs 4.5.1:libstdc ++.so.6.0.14)并strings /usr/lib/libstdc++.so.6 | grep GLIBCXX从中打印GLIBCXX_3.4到GLIBCXX_3.4.14.相反,在另一个系统上,它只打印到GLIBCXX_3.4.8(我得到了libstdc ++.so.6.0.8).
所以我有几个问题:
为什么我的链接器将c ++二进制文件链接到libstdc ++版本GLIBCXX_3.4.9而不是GLIBCXX_3.4.14?
如果我对libstdc ++版本编译我的二进制文件,GLIBCXX_3.4我想它几乎可以在任何地方运行.这会暗示任何问题吗?(例如:它会使用较旧的 - 因此更糟糕的算法实现吗?)
相反,我将我的程序静态链接到我的libstdc ++,我想它会在任何地方运行; 当然,二进制文件会更大(~1MB),任何其他优点/缺点?
我可以强制链接器将我的二进制文件链接到给定版本的libstdc ++吗?
当我执行命令安装应用程序后出现以下错误:/lib/ld-linux.so.2:错误的ELF解释器:没有这样的文件或目录
我不知道如何解决这个问题,找出我在网上搜索solotutions的解决方案,并找到以下解决方案:
yum install glibc.i686 or yum install glibc.i386
Run Code Online (Sandbox Code Playgroud)
但运气不好这根本没有用.它抛出以下错误:
Loaded plugins: fastestmirror, refresh-packagekit, security
Loading mirror speeds from cached hostfile
Setting up Install Process
No package glibc.i686 available.
Error: Nothing to do
Run Code Online (Sandbox Code Playgroud)
我再次尝试解决这个问题并从网上获得一些解决方案;
Download glibc rpm packge for centos 6 and install them.
Run Code Online (Sandbox Code Playgroud)
我下载了以下包装:
glibc-2.12-1.80.el6.i686.rpm
glibc-common-2.12-1.80.el6.i686.rpm
glibc-devel-2.12-1.80.el6.i686.rpm
glibc-headers-2.12-1.80.el6.i686.rpm
glibc-static-2.12-1.80.el6.i686.rpm
glibc-utils-2.12-1.80.el6.i686.rpm
Run Code Online (Sandbox Code Playgroud)
并尝试使用以下命令安装:
yum install glibc.i686
rpm -U glibc-2.12-1.80.el6.i686.rpm
rpm -ivh glibc-2.12-1.80.el6.i686.rpm
Run Code Online (Sandbox Code Playgroud)
他们都没有工作.得到以下消息:
[root@demo tmp_glibc]# rpm -ivh glibc-2.12-1.80.el6.i686.rpm
error: Failed dependencies:
glibc-common = 2.12-1.80.el6 is needed by glibc-2.12-1.80.el6.i686
libfreebl3.so is needed …Run Code Online (Sandbox Code Playgroud) 我正在寻找C标准库的源代码.我的意思是,例如,如何编写cos,abs,printf,scanf,fopen和所有其他标准C函数,我的意思是看他们的源代码.
所以在搜索时,我遇到了GLIBC,但我不知道它到底是什么.它是GNU C库,它包含一些源代码,但它们实际上是什么,它们是标准函数的源代码还是其他东西?它用于什么?
在线上的大多数资源都指出您可以静态链接glibc,但不建议这样做。例如centos软件包repo:
The glibc-static package contains the C library static libraries
for -static linking. You don't need these, unless you link statically,
which is highly discouraged.
Run Code Online (Sandbox Code Playgroud)
这些消息来源很少(或从来没有)说过为什么这不是一个好主意。