我写它使用的工具libbfd,并libopcodes在X86-32和x86-64 Linux来进行拆卸.问题是,虽然我能够获得libopcodes进行反汇编,但我无法获得任何指令信息.出于演示的目的,我做了一个最小的例子来重现我的问题.该程序应该从入口点拆分到第一个RET/ RETQ.
代码有点被全局修改,为简洁起见省略了错误检查等,但应该清楚地说明问题.
#include <bfd.h>
#include <dis-asm.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <string.h>
#include <ctype.h>
#include <limits.h>
#include <libiberty.h>
/*
* Holds state for BFD and libopcodes.
*/
bfd * abfd = NULL;
disassemble_info dinfo = {0};
/*
* Temporary hack to signal when disassembling should stop.
*/
static bool stop_disassembling = FALSE;
/*
* Gets path to currently running executable.
*/
bool get_target_path(char * target_path, …Run Code Online (Sandbox Code Playgroud) 我搜索过,但没找到一个选项告诉我我的Ubuntu上有什么版本的binutils.或者至少我不知道如何解释它.
gcc -v - 什么都不说binutils
ld -v - 告诉我GNU ld (GNU Binutils for Ubuntu) 2.24.这是否意味着我有binutils 2.24?
如果我想编译我的项目-flto是否足以建立gcc --enable-gold或者我还需要构建黄金并用它替换ld?我还需要其他标志吗?即我这样做
gcc -flto one.c two.c
Run Code Online (Sandbox Code Playgroud) 编译“make”时收到错误消息
$ make
g++ -fopenmp -o lang.test main.o -I../../../include/Lheader -I../../../include -L../../../lib/ -llmi -lblas -lboost_regex -lpthread -lleveldb
/usr/bin/ld: ../../../lib//liblmi.a(LMInterface.o): unrecognized relocation (0x2a) in section `.text'
/usr/bin/ld: final link failed: Bad value
collect2: error: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)
我找不到上述问题的任何解决方案。
GCC 版本和 ld 版本是这样的:
$ gcc --version
gcc (Ubuntu 5.4.1-2ubuntu1~14.04) 5.4.1 20160904
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR …Run Code Online (Sandbox Code Playgroud) 我在我的macbook pro(使用mac os x 10.6)上编译非常出色的Contiki OS时遇到了很多麻烦.Contiki实际上使用了许多GNU特有的功能和GCC,AR,LD等选项.所以我通过macports安装了这些实用程序,但看起来"port install binutils"不安装GNU ld,是吗?
所以,问题是,如何在我的Mac上获得GNU ld?是否有一种简单的替代方式(即wget, configure, make, make install方式)?
ar,nm和ranlib由binutils的包中提供的.gcc-ar,gcc-nm和gcc-ranlib由GCC包提供.我听说的gcc-ar,gcc-nm以及gcc-ranlib是"有效的包装"周围ar,nm和ranlib二进制文件分别.
是什么之间的差异的技术gcc-ar,gcc-nm以及gcc-ranlib与ar,nm和ranlib?GCC必须在其构建中提供这些二进制文件.
userland包的构建系统何时应该使用一个而不是另一个?如果用于构建userland包的工具链是基于GCC的,那么您使用哪一个(例如,arvs gcc-ar,nmvs gcc-nm)是否重要?
假设我有一个动态链接的ELF二进制文件,我想覆盖/重定向某些库调用.我知道我可以这样做LD_PRELOAD,但我想要一个在二进制文件中永久存在的解决方案,独立于环境,并且适用于setuid/setgid二进制文件,其中没有一个LD_PRELOAD可以实现.
我想做的是从其他目标文件添加代码(如果需要,可能在新的部分中),并将这些目标文件中的符号添加到二进制符号表中,以便使用新添加的代码版本代替共享库代码.我相信这应该是可能的,而不需要在现有代码中实际执行任何重定位; 即使它们在同一个文件中,它们也应该能够在运行时以通常的PLT方式解析(因为我只关心函数而不是数据).
请不要给我答案"你不想这样做!" 或者"那不便携!" 我正在研究的是一种将二进制文件与稍微ABI不兼容的备用共享库实现连接起来的方法.有问题的平台是i386-linux(即32位),如果重要的话.除非我弄错了什么是可能的,否则我可以编写一些工具来解析ELF文件并执行我的黑客攻击,但我怀疑有一种奇特的方法可以使用GNU链接器和其他工具来完成此操作而无需编写新代码.
考虑一下hello world C程序:
你好.:
#include "stdio.h"
int main()
{
printf("Hello, World!\n");
}
Run Code Online (Sandbox Code Playgroud)
如果我打电话:
$ gcc -c hello.c -o hello.o
Run Code Online (Sandbox Code Playgroud)
它将生成一个ELF可重定位文件hello.o
如果我然后打电话:
$ gcc hello.o -o hello [1]
Run Code Online (Sandbox Code Playgroud)
它将hello.o与ld链接并生成一个ELF可执行文件hello
但是,如果我直接调用ld [2]而不是[1]:
$ ld hello.o -o hello [2]
Run Code Online (Sandbox Code Playgroud)
我收到这些错误:
/usr/bin/ld.bfd.real: warning: cannot find entry symbol _start
test.c:(.text+0xa): undefined reference to `puts'
Run Code Online (Sandbox Code Playgroud)
gcc必须将其他选项传递给ld(例如链接C库).
反正有没有确定命令行gcc在命令中传递给ld的确切内容[1]?
我正在尝试在运行(10.9)x86_64的Mac OS X主机上为MIPS目标平台构建GCC/binutils.据我所知,我已经下载了最新版本的binutils和GCC,我也通过自制软件安装了GCC 4.8.2.
但是,到目前为止,我还没有成功在OS X主机上为MIPS arch构建GCC/binutils.
我尝试将CC环境变量设置为指向通过自制程序安装的gcc版本,但这似乎无法解决问题.
是否有人为此程序创建了分步指南?
我想交叉编译GCC.我使用MSYS2作为shell,并使用mingw-w64作为编译器.
我已经下载了binutils-2.25并配置了:
../binutils/./configure --target=sh3eb-elf --prefix=C:/tempinstall/ --disable-nls
Run Code Online (Sandbox Code Playgroud)
我尝试binutils在libiberty/pex-unix文件上构建时出错:
在函数'pex_wait'中:错误:'F_GETFD'未声明(在此函数中首次使用)错误:'FD_CLOEXEC'未声明(在此函数中首次使用)错误:'F_SETFD'未声明(首次在此函数中使用)错误:'F_DUPFD'未申报(首次使用此功能)
在函数'restore_fd'中:错误:'FD_CLOEXEC'未声明(在此函数中首次使用)错误:'F_SETFD'未声明(在此函数中首次使用)
在函数'pex_unix_fdopenw'中:错误:'F_SETFD'未声明(在此函数中首次使用)错误:'FD_CLOEXEC'未声明(首次在此函数中使用)
几个月前我已经构建了相同的编译器而没有任何问题.但我已经改变了OS(Windows 7到W10)和编译器(MinGW-GCC 4.8到Mingw64-GCC 4.9)
我按照本教程