RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 600744
Accepted
AccumPlus
AccumPlus
Asked:2020-12-07 22:34:03 +0000 UTC2020-12-07 22:34:03 +0000 UTC 2020-12-07 22:34:03 +0000 UTC

运行 gcc 并链接到其他库

  • 772

这个想法可能看起来很奇怪。我正在为 linux 创建一个开发环境。创建目录/home/user/myOS。它有 usr、usr/bin、usr/lib 和链接 bin->usr/bin、lib->usr/lib。我从一个操作系统中复制了必要的二进制文件和库(我们称之为 OSold,它更旧)。但是,我想在这个环境下使用新的编译器进行编译,所以我从另一个系统(我们称它为 OSnew,它是新鲜的)复制 g++ 和 gcc。(我不确定如果没有实际的 libc,我能否做点什么)。顺便说一句,环境是在 OSnew 上创建的。

我通过 chroot 进入环境。当编译器启动时,会发生以下情况:

bash-3.00# g++
g++: /lib/libc.so.6: version `GLIBC_2.11' not found (required by g++)
g++: /lib/libc.so.6: version `GLIBC_2.4' not found (required by g++)

我知道他需要这些库才能运行。我创建了一个单独的目录:/home/user/myOS/home/mylibs。我将实际的 libc 库放入其中。再次chroot,然后执行以下操作:

bash-3.00# LD_LIBRARY_PATH=/home/mylibs g++

但它仍然首先扫描标准目录并因上述错误而崩溃。尝试并通过出口 - 都一样。

告诉我如何在运行可执行文件时强制 shell 准确使用我的库?通常,LD_LIBRARY_PATH 正常工作需要什么?(然后我可以很好地复制一些重要的东西)。

关于重复的问题

这个问题是关于系统位数之间的差异。还有一个关于库版本的问题。

更新程序

很可能,在这个问题的框架内,如此强烈的变化是不可接受的。但是让版主决定。

一般来说,chroots可以忘记。在真正的旧系统上,在新系统上编译的程序使用以下命令运行:

g++ -m32 main.cpp -o Main -Wl,--hash-style=sysv

但是,当使用新的标准构造时,C++ 会生成以下内容:

./Main: /usr/lib/libstdc++.so.6: version 'GLIBC_3.4.21' not found (required by ./Main)

我试图指定新库的路径(显然是 32 位):

LD_LIBRARY_PATH="/home/temp/mylibs/" ./Main
./Main: error while loading shared libraries: /home/temp/mylibs/libstdc++.so.6: ELF file OS ABI invalid

任何想法如何解决这个问题?

linux
  • 1 1 个回答
  • 10 Views

1 个回答

  • Voted
  1. Best Answer
    Majestio
    2020-12-08T01:14:12Z2020-12-08T01:14:12Z

    @AccumPlus,编写了一个小的 shell 脚本,希望对库路径有所帮助。该脚本在启动目录中创建了三个程序,并分别为它们创建了三个动态链接库。将程序和库分散在 chroot 目录中,可以评估环境设置的正确性。

    运行脚本

    • 以普通用户身份登录
    • 创建一个空目录mkdir -p $HOME/HelloPrograms && cd $HOME/HelloPrograms
    • 创建一个脚本文件。例如,build-hello.sh
    • 发射sh build-hello.sh
    • 三个程序将组装并运行
    • 一切,你可以分散在 chroots 上

    build-hello.sh

    #!/bin/sh
    
    export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH
    
    function BuildHello {
      echo "#include \"HelloLibrary-$1.h\"" > HelloLibrary-$1.c
      echo "#include <stdio.h>" >> HelloLibrary-$1.c
      echo " " >> HelloLibrary-$1.c
      echo "void  Hello$1(const char* msg) {" >> HelloLibrary-$1.c
      echo "  printf(\"Hello, %s-$1!\\n\",msg);" >> HelloLibrary-$1.c
      echo "}" >> HelloLibrary-$1.c  
      echo "#pragma once" > HelloLibrary-$1.h
      echo "void  Hello$1(const char* msg);" >> HelloLibrary-$1.h
      echo "#include <stdio.h>" > HelloProgram-$1.c
      echo "#include \"HelloLibrary-$1.h\"" >> HelloProgram-$1.c
      echo " " >> HelloProgram-$1.c
      echo "int main(int argc, char* argv[]) {" >> HelloProgram-$1.c
      echo "  Hello$1(\"Program\");" >> HelloProgram-$1.c
      echo "  return 0;" >> HelloProgram-$1.c
      echo "}" >> HelloProgram-$1.c
      gcc -c -fPIC HelloLibrary-$1.c -o HelloLibrary-$1.o
      gcc -shared -Wl,-soname,libHelloLibrary-$1.so -o libHelloLibrary-$1.so HelloLibrary-$1.o
      gcc HelloProgram-$1.c -o HelloProgram-$1 -L. -lHelloLibrary-$1
      rm -f *.{c,h,o}
    }
    
    clear
    
    if [ "$(whoami)" == 'root' ]; then 
      echo "Ахтунг: под учетной записью рута работать отказываюсь!" 
      exit 1 
    fi
    
    for Num in {1..3}
    do
      BuildHello $Num
      ./HelloProgram-$Num
    done
    

    希望它对您的搜索有所帮助:)

    附言。忘了...查看所需的库,运行,例如:

    ldd $HOME/HelloPrograms/HelloProgram-1

    添加:构建交叉编译工具包

    既然最后明确了目标,竟然是构建交叉编译的工具,那我就继续答题。

    • 首先,我们阅读有关如何完成所有操作的文档,例如this和this以及this
    • 我们去网站http://mxe.cc,在那里我们选择并安装了一套适用于 Windows 的交叉编译器(有 8 个 x32/x64/shared/static/posix/win 集)。窄焦点(仅限 Win),与类似工具(例如来自 Gentoo/Funtoo Linux 的 crossdev)相比,它提供了更好的适配结果
    • 另一个不错的工具包 - crosstools-ng,多用途
    • 用于嵌入式系统的基于 clang/LLVM 的交叉编译工具包 - ELLCC,尽管(?)目标是 ARM、i386、Mips、PowerPC、X86_64

    一般来说,我认为初始信息就足够了。这个问题不是很简单 - 一个关于 ruSO 的主题显然是不够的。

    • 1

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    如何停止编写糟糕的代码?

    • 3 个回答
  • Marko Smith

    onCreateView 方法重构

    • 1 个回答
  • Marko Smith

    通用还是非通用

    • 2 个回答
  • Marko Smith

    如何访问 jQuery 中的列

    • 1 个回答
  • Marko Smith

    *.tga 文件的组重命名(3620 个)

    • 1 个回答
  • Marko Smith

    内存分配列表C#

    • 1 个回答
  • Marko Smith

    常规赛适度贪婪

    • 1 个回答
  • Marko Smith

    如何制作自己的自动完成/自动更正?

    • 1 个回答
  • Marko Smith

    选择斐波那契数列

    • 2 个回答
  • Marko Smith

    所有 API 版本中的通用权限代码

    • 2 个回答
  • Martin Hope
    jfs *(星号)和 ** 双星号在 Python 中是什么意思? 2020-11-23 05:07:40 +0000 UTC
  • Martin Hope
    hwak 哪个孩子调用了父母的静态方法?还是不可能完成的任务? 2020-11-18 16:30:55 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    user207618 Codegolf——组合选择算法的实现 2020-10-23 18:46:29 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    Arch ArrayList 与 LinkedList 的区别? 2020-09-20 02:42:49 +0000 UTC
  • Martin Hope
    iluxa1810 哪个更正确使用:if () 或 try-catch? 2020-08-23 18:56:13 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5