我试图找到运行需要火炬库的 lua 脚本实际需要的每个库
测试.lua:
#!/usr/bin/env lua
print "Welcome to LUA"
print('_VERSION = ' .. _VERSION)
require("nn") -- this loads torch nn libraries to be further used in the code
print "Load pass"
Run Code Online (Sandbox Code Playgroud)
输出:
Welcome to LUA
_VERSION = Lua 5.1
Load pass
Run Code Online (Sandbox Code Playgroud)
当我使用
lld ./lua
# or
lld ./lua test.lua
Run Code Online (Sandbox Code Playgroud)
我得到以下输出:
ldd ./lua ../../../bin/test.lua
linux-vdso.so.1 => (0x00007ffdba77d000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f160dd3e000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f160db3a000)
libreadline.so.6 => /lib/x86_64-linux-gnu/libreadline.so.6 (0x00007f160d8f3000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f160d52a000)
/lib64/ld-linux-x86-64.so.2 (0x00005580e2ebd000)
libtinfo.so.5 => /lib/x86_64-linux-gnu/libtinfo.so.5 …Run Code Online (Sandbox Code Playgroud) 有没有办法控制共享库中符号的命名?具体来说,我一直在使用GCC进行一个项目,我们通过Python中的C-Types访问共享库.这很好用,但是最近我一直在使用建议使用英特尔编译器的系统.我可以很好地构建共享对象,但我发现与intel相比,这些符号的命名约定略有不同.特别是当我使用gcc编译时,符号名称如下所示:
__test_function_MOD_read_a_file
Run Code Online (Sandbox Code Playgroud)
英特尔编译的共享对象具有如下符号名称:
test_function_mp_read_a_file__
Run Code Online (Sandbox Code Playgroud)
有没有办法强制命名的一致性或至少在事后改变符号的名称?
例如,考虑以下代码test_function.f90
MODULE test_function
CONTAINS
SUBROUTINE read_a_file
PRINT *,'I did a thing!'
END SUBROUTINE
END
Run Code Online (Sandbox Code Playgroud)
编译行看起来应该是这样的
gfortran -fPIC -c test_function.f90
gfortran -shared -o libtest_function.so test_function.o
Run Code Online (Sandbox Code Playgroud) 我正在尝试在我的 C 代码中使用memfd_create系统调用。我试图包含sys/memfd.h,因为手册页memfd_create说是适当的,但是 GCC 给了我一个错误“sys/memfd:没有这样的文件或目录”。
我尝试过谷歌搜索,但找不到有同样问题的人。我注意到某些版本的联机帮助页memfd_create说我应该包含sys/mman.h,但当我尝试它时它似乎没有帮助。它会说memfd_create是隐式声明的。
这是我的问题的最小再现。
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/mman.h>
#include <sys/memfd.h>
int main(){
int fd;
fd = memfd_create("test", MFD_CLOEXEC);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我希望上面的代码能够编译并运行而不会出现错误。
我需要更改共享库 (.so) 文件中的某些符号,如下例所示:我需要将abc.so 文件中的符号重命名为 symbol xyz。我有一个工具可以在头文件中替换它,我面临的唯一挑战是更改我的 .so 共享库。对于共享库,是否有任何工具或命令可以帮助我反汇编 .so 文件、更新符号并再次重新组装为 .so 文件?对于共享库,我们需要一种重建符号表的机制。如果有任何工具可以完成我的任务,需要帮助吗?
仅供参考:更改源是最好的方法,但对于短期的解决方案来说,它可以帮助在符号级别替换代码字。
我收到此编译器错误.我有几百行代码,所以我会发布一些我认为可能相关的代码,但你需要告诉我你想看到的内容.
这是我在编译时得到的错误:
/tmp/ccBE5kZ5.o:game.cpp:(.text+0x1067): undefined reference to `vtable for Person'
/tmp/ccBE5kZ5.o:game.cpp:(.text+0x17a5): undefined reference to `vtable for Person'
/tmp/ccBE5kZ5.o:game.cpp:(.text+0x1ee6): undefined reference to `vtable for Person'
/tmp/ccBE5kZ5.o:game.cpp:(.text+0x2560): undefined reference to `vtable for Person'
/usr/lib/gcc/i686-pc-cygwin/3.4.4/../../../../i686-pc-cygwin/bin/ld: /tmp/ccBE5kZ5.o: bad reloc address 0xc in section `.text$_ZN6WeaponD1Ev[Weapon::~Weapon()]'
/usr/lib/gcc/i686-pc-cygwin/3.4.4/../../../../i686-pc-cygwin/bin/ld: final link failed: Invalid operation
collect2: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)
这是我的Person班级和我的Weapon班级的宣言,而Actor班级Person是以下的后代:
class Actor {
public:
virtual void act();
virtual string getName();
virtual void setName(string n);
Actor();
Actor(string n);
virtual ~Actor();
private: …Run Code Online (Sandbox Code Playgroud) 默认情况下,所有符号都导出到动态表,那么为什么要使用-rdynamic标志?即使我们通过attribute /隐藏某些符号-fvisibility=hidden- -rdynamic不会更改结果,也不会取消隐藏先前隐藏的符号。那有什么意义呢?