【问题标题】:bits/spin-lock.h: No such file or directorybits/spin-lock.h:没有这样的文件或目录
【发布时间】:2024-04-28 14:00:02
【问题描述】:

我构建 glibc 失败,并显示消息:

../libpthread/sysdeps/pthread/bits/mutex.h:34:30:致命错误:bits/spin-lock.h:没有这样的文件或目录

我的系统是 ubuntu 16.04 LTS。 我通过命令“apt-get source libc6-dev”获得了源代码。 使用以下命令构建: ../glibc-2.23/configure -CFLAGS='-g -O0 -U_FORTIFY_SOURCE -fno-stack-protector' --with-headers=/usr/include

为什么会失败,有什么办法可以得到我电脑中安装的glibc的配置信息?

【问题讨论】:

    标签: ubuntu libc


    【解决方案1】:

    注意:我使用的是 Ubuntu 17.04。

    正在做一些非常相似的事情:

    apt source libc6
    cd glibc-2.24
    dpkg-buildpackage # found in package dpkg-dev (which depends on a bunch of Perl scripts in libdpkg-perl)
    

    这个命令应该构建一个可安装的包(但我没有耐心等待,因为它会迭代几个我认为我不需要的包配置)。

    我想做的是用调试信息重新引导 libc,使用:

    • dpkg-buildpackageexport DEB_BUILD_OPTIONS=nostrip,noopt,或
    • debuild(在包devscripts中找到),见here

    ...但那是另一回事了。

    dpkg-buildpackage 命令发出日志,在这些日志中,我们找到使用的配置命令(换行符以提高可读性):

    CC="x86_64-linux-gnu-gcc-6 -no-pie -fno-PIE" \
    CXX="x86_64-linux-gnu-g++-6 -no-pie -fno-PIE" \
    MIG="x86_64-linux-gnu-mig" \
    AUTOCONF=false \
    MAKEINFO=: \
    /usr/src/glibc-2.24/configure \
    --host=x86_64-linux-gnu \
    --build=$configure_build \
    --prefix=/usr \
    --enable-add-ons=libidn,"" \
    --without-selinux \
    --enable-stackguard-randomization \
    --enable-obsolete-rpc \
    --with-pkgversion="Ubuntu GLIBC 2.24-9ubuntu2" \
    --with-bugurl="https://bugs.launchpad.net/ubuntu/+source/glibc/+bugs"    \
    --with-headers=/usr/src/glibc-2.24/debian/include \
    --enable-kernel=2.6.32 \
    --with-selinux \
    --enable-systemtap \
    --enable-multi-arch
    

    经过一些实验,我能够减少命令所需的基本标志的数量,如下所示:

    # same as above
    apt source libc6
    cd glibc-2.24
    
    # regenerate the configure script (not essential, but doesn't hurt)
    touch configure.ac
    autoconf
    
    # extra setup (sets-up kernel and library headers for use with --with-headers)
    make -f ./debian/rules
    
    # cannot build in source tree anyways
    mkdir -p build and cd build
    
    MAKEINFO=: CFLAGS="-g -O2" CXXFLAGS="-g -O2" ../configure --prefix=/dbg --with-headers=/usr/src/glibc-2.24-git/debian/include --enable-add-ons=libidn
    
    make -j 4
    
    make install DESTDIR=$(pwd)/install  # testing installation
    make check                           # 'actual' testing
    

    注意事项:

    • make -f ./debian/rules 的调用必不可少以启用--with-headers
    • 显然,libc 不支持调试构建(即未优化):glibc cannot be compiled without optimization(请参阅here)。甚至 -O1 也不支持。
    • --enable-add-ons=libidn:默认在所有子目录中查找“附加组件”(相当于在 v2.24 中设置 --enable-add-ons=fbtl,libidn,libpthread)。如果我将fbtllibpthread 添加到列表中,则会出现错误,即: No rule to make target '/usr/src/glibc-2.24-git/build/bits/stdio_lim.st', needed by '/usr/src/glibc-2.24-git/build/bits/stdio_lim.h'
    • 事实上,无论--enable-add-ons如何,都会构建libpthread

    补充说明:

    • 我使用--prefix=/dbg,这样我就不会安装在系统库之上(我满足于使用LD_LIBRARY_PATH 来查找我的依赖项)。如果您将其保留为默认值 (/usr/local),则必须设置 --disable-sanity-checks
    • MAKEINFO=: 稍后会避免一个小错误(在make install 期间)

    此外,即使make check 似乎有效,我删除的一些标志也可能很重要。我不是构建 glibc 的专家。

    【讨论】:

    • 其实'make check'的结果并不完美:测试结果总结:129 FAIL 2348 PASS 13 UNSUPPORTED 43 XFAIL 2 XPASS
    最近更新 更多