Articles of 连接器

如何使Unix二进制独立?

我有一个没有源代码的Linux二进制文件,可以在一台机器上运行,我想制作一个独立的软件包,它可以在同一架构的不同机器上运行。 什么是实现这个方法? 在我的情况下,两台机器具有相同的体系结构,相同的Ubuntu内核,但是目标机器没有make并且在/lib和/usr下有错误的文件版本 我有一个想法是使用chroot并重新创build二进制文件系统的一个子集,可能使用strace来找出它需要的。 有没有这样做的工具? 对于后人来说,这是我如何确定一个进程打开的文件 #!/usr/bin/python # source of trace_fileopen.py # Runs command and prints all files that have been successfully opened with mode O_RDONLY # example: trace_fileopen.py ls -l import re, sys, subprocess, os if __name__=='__main__': strace_fn = '/tmp/strace.out' strace_re = re.compile(r'([^(]+?)\((.*)\)\s*=\s*(\S+?)\s+(.*)$') cmd = sys.argv[1] nowhere = open('/dev/null','w')# p = subprocess.Popen(['strace','-o', strace_fn]+sys.argv[1:], stdout=nowhere, […]

ldconfig错误:不是一个符号链接

运行时: sudo /sbin/ldconfig 出现以下错误: /sbin/ldconfig: /usr/local/lib/ is not a symbolic link 当我运行文件: file /usr/local/lib/ /usr/local/lib/: directory 在/usr/local/lib/里面有三个我使用的库。 我将在这里称为lib1 , lib2和lib3 。 现在,当我在我的二进制文件上执行ldd时,结果如下: lib1.so => not found lib2.so => not found lib3.so => /usr/local/lib/lib3.so (0x00216000) 但是,所有的文件都在/usr/local/lib/{lib1,lib2,lib3}.so文件夹中。 每次运行ldconfig ,都会出现相同的错误: /usr/local/lib/ is not a symbolic link 我以为/usr/local/lib应该在/etc/ld.conf.d/*.conf声明两次,但不是: sudo egrep '\/usr\/local' /etc/ld.so.conf.d/* projectA.conf.old:/usr/local/projectA/lib local.conf:/usr/local/lib ld.so.conf只包含/etc/ld.so.conf.d/*.conf ,所以这个*.old不会被处理,而是指向/usr/local/projectA/lib 。 经过一段时间我删除了所有的lib1和lib2(在某些时候我testing了它的二进制文件夹),同样的错误发生。

为什么这个GLUT程序不能编译? 我是否缺less库或头文件?

我刚刚开始使用Linux(Mint 11),最近我决定把OpenGL编程作为一项业余爱好。 我发现代码和技术相对简单,但是我很难将所有资源都放在正确的位置。 代码是: #include <stdlib.h> #include <stdio.h> #include <GL/glew.h> #ifdef __APPLE__ # include <GLUT/glut.h> #else # include <GL/glut.h> #endif static int make_resources(void) { return 1; } static void update_fade_factor(void) { } static void render(void) { glClearColor(1.0f, 1.0f, 1.0f, 1.0f); glClear(GL_COLOR_BUFFER_BIT); glutSwapBuffers(); } int main(int argc, char** argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE); glutInitWindowSize(400, […]

将apache请求转发给c ++程序

我基本上寻找如何解决这个问题的提示和技巧。 我有一个服务器软件(Linux),它是用C ++编写的。 我需要做的是提供一些信息,这是在该软件内生成的,通过http调用到Apachenetworking服务器。 当然,将数据存储在数据库中并为其编写一个servlet或使用IPC来获取数据是可能的,但是我想保持简单,并将其捆绑在一个文件中。 而且我想知道这个想法是否可行。 所以工作stream将如下所示:客户端 – > Apache Web服务器 – > C ++软件 是否有任何现有的库或可以处理Apache – > C ++连接的东西? 或者它会像只是将请求redirect到一个在c + +中的套接字,并手动执行? 基本上像tomcat连接器。 编辑 请注意,服务器软件在后台永久运行,不应该由电话“启动”

在Linux上的C + +开发 – 我在哪里开始?

我决定离开我的Windows后面安装,现在运行Debian作为我的默认操作系统。 我一直使用Windows编码,特别是使用Visual Studio。 我目前正试图习惯于在linux下编译我的代码。 虽然我还有很多文档要阅读,不要指望你们对我来说太简单了,但是从某个angular度来看,还是很好的。 我有一些具体的问题,但随时build议/推荐任何有关这个问题。 什么是build立一个make文件的build议指南,如何从这个makefile编译(我自己调用g ++,我使用'make'?) 看看其他的linux软件,他们几乎总是有一个“configuration”文件。 它究竟做了什么? 它是否只检查所需的库是否安装或不仅仅是检查需求? 我如何链接库,这与我的makefile或g ++参数有什么关系? 在Windows中我会编译库,包括一些头文件,告诉我的链接器什么额外的lib文件链接,并复制一个dll文件。 这个过程到底如何在Linux中工作? 代码编辑器的build议? 我目前使用nano,我听说过vim和emacs,但不知道他们的优点是什么,而不是彼此。 还有没有其他的,为什么我会考虑他们在前三个? 注意:我不是在寻找一个IDE。 任何帮助,指南和文档(最好是针对初学者)的链接非常感谢!

为什么指定input库的顺序很重要?

我对Linux编程相当陌生。 你可以说我是一个Windows的家伙。 所以,我把我的项目移植到了Linux上,它几乎让我疯了:我确定我已经用-l标志指定了所有的依赖关系,但是我得到了“未解决的符号”错误。 然后我发现了这个话题,它解决了我的问题: 在Linux上使用GCC连接 有人可以解释一下为什么这个命令很重要,它究竟有多重要? 我很确定这不是MSVC链接器的情况下…

lib {库名} .a / .so是Linux中静态库的命名约定吗?

我不得不在Ubuntu系统上做一些小的编程(在这个系统上,我是一个非常低级的初学者),我真的只是熟悉makefile。 我注意到告诉链接器哪些库包含的参数总是-l {库名},其中相应的库将在/ usr / lib文件夹中被称为“lib {库名} .a”。 我想知道:这是一个惯例吗? 我本以为我需要input-llibNAME才能find一个名为libNAME.a的库,但似乎假设了一个lib前缀。 这总是如此吗? 我可以命名一个库,而不使用lib前缀?

将符号链接到Linux上的固定地址

如何使用GNU ld将(某些)符号链接到特定的固定地址,以便二进制文件在Linux(x86)中仍可正常执行? 这些符号将不会被访问,但是他们的地址是重要的。 例如,我会有以下结构: struct FooBar { Register32 field_1; Register32 field_2; //… }; struct FooBar foobar; 我想链接foobar地址0x76543210,但正常链接标准库和应用程序的其余部分。 然后,应用程序将使用foobar的地址,但不会引用它后面的(可能不存在的)内存。 这个请求的基本原理是可以在两个平台上使用同一个源代码:在本地平台上, Register32可以简单地是一个volatile uint32_t ,但是在Linux Register32是一个与uint32_t相同大小的C ++对象,例如operator= ,然后它将使用该对象的地址,并向具有该地址(和数据)的通信框架发送请求以在远程硬件上执行实际的访问。 链接器将因此确保结构的Register32字段引用正确的“地址”。

在glibc中禁用AVX优化的函数(LD_HWCAP_MASK,/etc/ld.so.nohwcap)用于valgrind&gdblogging

具有glibc的现代x86_64 linux将检测到CPU支持AVX扩展,并将许多string函数从通用实现切换到AVX优化版本(借助于ifunc dispatchers: 1,2 )。 这个特性对性能有好处,但是它可以防止valgrind( valgrind-3.8之前的老版本libVEXs )和gdb的“ target record ”( Reverse Execution )无法正常工作(Ubuntu“Z”17.04 beta, gdb 7.12 .50.20170207- 0ubuntu2,gcc 6.3.0-8ubuntu1 20170221,Ubuntu GLIBC 2.24-7ubuntu2): $ cat ac #include <string.h> #define N 1000 int main(){ char src[N], dst[N]; memcpy(dst, src, N); return 0; } $ gcc ac -oa -fno-builtin $ gdb -q ./a Reading symbols from ./a…(no […]

如何告诉mex与libstdc ++。so.6在/ usr / lib而不是在MATLAB目录中的链接?

现在mex在MATLAB 2012a只正式支持gcc 4.4.6,但我想使用gcc 4.7在我自己的风险。 现在,如果我直接用mex编译一些东西,它会抱怨 /usr/lib/gcc/i686-linux-gnu/4.7/cc1plus: /usr/local/MATLAB/R2012a/sys/os/glnx86/libstdc++.so.6: version `GLIBCXX_3.4.15' not found (required by /usr/lib/i386-linux-gnu/libppl_c.so.4) /usr/lib/gcc/i686-linux-gnu/4.7/cc1plus: /usr/local/MATLAB/R2012a/sys/os/glnx86/libstdc++.so.6: version `GLIBCXX_3.4.15' not found (required by /usr/lib/i386-linux-gnu/libppl.so.9) 通过strings /usr/lib/i386-linux-gnu/libstdc++.so.6 | grep 'GLIBCXX' strings /usr/lib/i386-linux-gnu/libstdc++.so.6 | grep 'GLIBCXX'我确认这个libstdc++.so.6有版本string。 我复习了mexopts.sh并修改了该脚本中的variables$RPATH和$MLIBS ,但是它不起作用。 所以,如果我不使用符号链接,我可以在哪里configurationlibstdc++.so.6的pathlibstdc++.so.6 谢谢。