标签: binutils

使用 binutils 在目标文件之间复制 ELF 部分

由于错误,ld我需要将 ELF 部分从一个目标文件复制到另一个目标文件。我可以将所需的部分转储到文件中,但问题是该objcopy选项--add-section需要二进制文件,因此部分类型信息会丢失。据我所知,我无法使用 binutils 设置部分的类型,但我希望我错了:)

我可以手动编辑二进制文件以设置节类型并解决根本问题,但我很好奇是否有基于标准工具的解决方案。

对于好奇的人来说,潜在的问题是,当 GNUld链接没有该部分的 ARM 目标文件.ARM.attributes(例如在其自己的部分中只有一个二进制 blob 的文件)时,它会选择一些默认值,导致它甚至为 RAM 函数生成无效的胶合板当包含调用的文件有好的.ARM.attributes 部分时。我能想到的唯一解决方案(待定 https://sourceware.org/bugzilla/show_bug.cgi?id=11897.ARM.attributes )是向二进制 blob 对象文件添加一个部分。.ARM.attributes但是,只有当该部分的类型为时,这才有效ARM_ATTRIBUTES

linker elf binutils

6
推荐指数
0
解决办法
725
查看次数

objdump 不适用于 ELF 64 位 x86-64,

我有一个来自 Tiny C 编译器的 64 位 ELF 目标代码。我无法让 gobjdump 显示反汇编代码。我使用的是 OS X 10.10.5。

$ file hello.o 
hello.o: ELF 64-bit LSB relocatable, x86-64, version 1 (SYSV), not stripped
$ gobjdump -d hello.o
gobjdump: hello.o: File format not recognized

$ greadelf -h hello.o
ELF Header:
  Magic:   7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 
  Class:                             ELF64
  Data:                              2's complement, little endian
  Version:                           1 (current)
  OS/ABI:                            UNIX - System V
  ABI Version:                       0
  Type:                              REL …
Run Code Online (Sandbox Code Playgroud)

c binutils

6
推荐指数
1
解决办法
7791
查看次数

将 32 位和 64 位代码链接到一个二进制文件中

在对此问题的评论中, Unexpected Behaviour in simple Pointer Algoriths in kernel space C code 中,Michael Petch 写道,“64 位 ELF 格式支持 32 位代码段。”

我有一个工作程序,其中包含 32 位和 64 位代码以及它们之间的切换。我一直无法弄清楚如何将编译器生成的 32 位和 64 位代码链接在一起而不出现链接器错误,因此所有 32 位代码都是用汇编语言编写的。随着项目变得越来越复杂,32位汇编代码的维护也变得更加繁重。

这是我所拥有的:

test32.cc 是用-m32.
所有其他源文件都是在没有该标志的情况下使用-mcmodel=kernel.

在链接描述文件中:

OUTPUT_FORMAT("elf64-x86-64")
OUTPUT_ARCH(i386:x86-64)
Run Code Online (Sandbox Code Playgroud)

在生成文件中:

LD := ld
LDFLAGS := -Map $(TARGET).map -n --script $(LDSCRIPT)
$(LD) $(LDFLAGS) -b elf32-x86-64 $(OBJS64) -b elf32-i386 $(OBJS32) -o $@
Run Code Online (Sandbox Code Playgroud)

我收到错误:

ld: i386 architecture of input file 'test32.o' is incompatible with i386:x86-64 output
Run Code Online (Sandbox Code Playgroud)

将 OUTPUT_ARCH 更改为 …

gcc x86-64 osdev binutils

6
推荐指数
0
解决办法
1941
查看次数

使用dlopen()动态加载共享对象

我正在开发一款普通的X11应用程序.

默认情况下,我的应用程序只需要libX11.so和标准的gcc C和数学库.该应用程序可以扩展功能与Xfixes,Xrender和ALSA音响系统.但是,这些(Xfixes,Xrender和ALSA)功能是可选的.

为了实现这个行为,我使用运行时加载,即libXrenes,libXrender和libasound应该是dlopen()ed.

因此,App可以在没有这样的库的情况下运行.

现在我的问题:

What library names should I use when calling dlopen()?  
Run Code Online (Sandbox Code Playgroud)

我发现这些不同于发行版和发行版.
例如,在openSUSE 11上,它们的名称如下:

  • libXfixes.so
  • libXrender.so
  • libasound.so

但是,在Ubuntu上,名称附有版本号,如下所示:

  • libXfixes.so.3
  • libXrender.so.1
  • libasound.so.2

因此尝试打开"libXfixes.so"会在Ubuntu上失败,尽管lib显然存在.它只附有一个版本号.那我的应用应该如何处理呢?
我应该让我的应用程序首先手动扫描/ usr/lib /以查看我们有哪些库,然后选择合适的库?或者有没有人有更好的主意?

多谢你们,

安迪

linux x11 dlopen binutils

5
推荐指数
1
解决办法
3406
查看次数

如何使用GNU汇编程序(as)将程序集文件编译为原始二进制文件(如DOS .com)格式?

我想在Windows中编译这个源代码(这只是一个例子):

start:
NOP
NOP
Run Code Online (Sandbox Code Playgroud)

当我用NASM或FASM编译它时,输出文件长度是2个字节.但是当我用GNU汇编程序(as)编译它时,输出文件长度是292字节!

如何使用GNU汇编程序(as)将程序集文件编译为原始二进制文件(如DOS .com)格式?


为什么我这样做?

我想编写自己的简单操作系统,用C编写代码(不使用任何C标准库,甚至是stdio.h或math.h)并将其转换为汇编:

gcc -S my_os.c -o my_os.asm -masm=intel
Run Code Online (Sandbox Code Playgroud)

然后,我将汇编文件编译为原始二进制文件:

as my_os.asm
Run Code Online (Sandbox Code Playgroud)

然后我重命名a.out(汇编程序的输出)到my_os.flp最后用VMWare启动我的操作系统:)

assembly gnu-assembler binutils

5
推荐指数
1
解决办法
7302
查看次数

为什么arm-none-eabi-size报告.data部分为0,即使我使用初始化的RAM?

当我使用我的工具链(Yagarto和codesourcery)大小实用程序时,我对结果感到有些困惑.它报告我在数据部分使用0字节.见下文

$ arm-none-eabi-size.exe rest-server-example.crazy-horse.elf
   text    data     bss     dec     hex filename
  79364       0   34288  113652   1bbf4 rest-server-example.crazy-horse.elf
Run Code Online (Sandbox Code Playgroud)

我知道我的代码正在使用静态RAM变量并将其初始化为0以外的值.

有趣的是,当我直接传递大小工具的一些目标文件时,我看到.data部分被报告

例:

   text    data     bss     dec     hex filename
   1648       0      20    1668     684 obj_crazy-horse/uip-nd6.o
    200      12    2652    2864     b30 obj_crazy-horse/uip-packetqueue.o
     12       0       0      12       c obj_crazy-horse/uip-split.o
   1816      24      48    1888     760 obj_crazy-horse/usb-core.o
    284       0       0     284     11c obj_crazy-horse/usb-interrupt.o
   2064      20     188    2272     8e0 obj_crazy-horse/xmac.o
Run Code Online (Sandbox Code Playgroud)

当构成它的目标文件报告非零值时,为什么elf文件会为.data部分报告0?

仅供参考我正在研究AT91SAM7x256 Micro的嵌入式软件

编辑:

添加CFLAGS和LDFLAGS

CFLAGS  += -O -DRUN_AS_SYSTEM -DROM_RUN  -ffunction-sections

LDFLAGS += -L $(CPU_DIRECTORY) -T $(LINKERSCRIPT) -nostartfiles -Wl,-Map,$(TARGET).map …
Run Code Online (Sandbox Code Playgroud)

c embedded linker arm binutils

5
推荐指数
1
解决办法
4411
查看次数

在CentOS上构建整个工具链的教程

我正在使用CentOS 6机器,它有很老的GCC/GlibC版本.我想用最新或至少非常新版本构建整个glibc,binutils,gcc工具链,以便在最新的gcc中使用c ++ 11支持,在最近的binutils中使用ld.gold,并且可能在最近的glibc中进行改进.

我想将整个工具链放在一个单独的目录中,而不是影响任何现有的系统文件.我还想用--sys-root构建gcc,这样在使用gcc时,我不需要指定-I/some/directory/include和-L/some/directory/lib或其他任何参数.生成的可执行文件也将自动使用新的ld-linux-xxxxx程序加载器,它将自动找到新的libc.so.

任何人都知道这个任务是否存在一些教程?

gcc glibc centos binutils centos6

5
推荐指数
1
解决办法
2100
查看次数

如何使用OBJCOPY的--add-section开关?

确实有两个问题与--add-section的使用有关。简单的标题中。根据我的阅读,我还无法弄清楚如何执行--add-section。

要使用add-section,我必须传递一个部分名称。如果我使用现有的节名称,程序将响应“无法添加节'.data':文件格式错误”。也许我只需要传递另一个参数。如果我希望使用新的节名称,则会警告“分配的节'.blob'不在段中”。

现在,除了“不在细分市场”警告之外,我还需要我的功能才能正常工作。我想弄清楚是否存在将这个Blob放入可执行文件的合法方法。我会链接进去,但这不是那么容易,因为我要添加的数据是从可执行文件本身的内容生成的。

第二个问题确实是我关心的问题。给定链接完成后才能计算blob,有没有一种方法可以执行以下操作。

  1. 链接ELF文件
  2. 从ELF文件和其他数据生成Blob
  3. 将blob添加到ELF文件,以便在运行时将其加载到内存中的正确位置

    objcopy --add-section .blob=blob.o \ --set-section-flags .blob=alloc,contents,load,readonly \ --change-section-address .blob=ADDRESS \ program.elf program.blobbed.elf

我很乐意将一部分和/或片段添加到ELF文件中,作为链接的一部分,并在其中插入该blob。我不确定该怎么做。

我想到可以通过第二个链接来完成此任务,但是objcopy会更干净。

  1. 链接ELF文件
  2. 从ELF文件和其他数据生成Blob
  3. 重新链接包括新的blob.o的ELF文件

更新:只要重新链接在第一个链接所产生的程序部分中没有改变,则最后一种策略可能是可行的。它不是第一次尝试,但是有可能解决它。因此,希望使用--add-section来添加该blob而不是通过第二个链接。

embedded linker-scripts binutils

5
推荐指数
1
解决办法
4740
查看次数

构建ELLCC时出错

build从ELLCC 运行脚本会导致此错误

gcc -DHAVE_CONFIG_H -I. -I../../../src/binutils/binutils  -I. -I../../../src/binutils/binutils -I../bfd -I../../../src/binutils/binutils/../bfd -I../../../src/binutils/binutils/../include -I./../intl -DLOCALEDIR="\"/Library/Caches/Homebrew/ellcc--svn-HEAD/lib/share/locale\"" -Dbin_dummy_emulation=bin_vanilla_emulation  -W -Wall -Wstrict-prototypes -Wmissing-prototypes -Wshadow -Werror -Wno-unused-value -Wno-shadow  -MT nm.o -MD -MP -MF .deps/nm.Tpo -c -o nm.o ../../../src/binutils/binutils/nm.c
../../../src/binutils/binutils/nm.c:1690:28: error: 'sbrk' is deprecated
      [-Werror,-Wdeprecated-declarations]
      char *lim = (char *) sbrk (0);
                           ^
/usr/include/unistd.h:582:7: note: 'sbrk' declared here
void    *sbrk(int);
         ^
Run Code Online (Sandbox Code Playgroud)

以下编译器使用了相同的结果:

  • gcc 4.8
  • llvm-gcc 2.8
  • llvm 3.3

macos clang cross-compiling binutils ellcc

5
推荐指数
2
解决办法
3948
查看次数

在centos 5上安装Tensorflow

我正在尝试在Centos 5上安装Tensorflow.不幸的是,在使用pip安装它之后,正如官方文档中所解释的那样

sudo pip install --upgrade https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-0.5.0-cp27-none-linux_x86_64.whl

当我尝试在python shell上导入tensorflow时出现以下错误

ImportError:/home/users/caohao/.jumbo/lib/python2.7/site-packages/tensorflow/python/_pywrap_tensorflow.so:ELF文件操作系统ABI无效

github上的以下问题给了我一个主角:https: //github.com/tensorflow/tensorflow/issues/350

实际上,tensorflow要求glibc版本至少为2.17

当我输入

ldd --version

我有以下输出:

ldd (GNU libc) 2.5
Run Code Online (Sandbox Code Playgroud)

所以我需要升级glibc.我想执行"并行"安装,因为升级glibc对我的机器来说可能是危险因此我下载了源代码,并且我使用了命令

../glibc-2.18/configure --prefix =/opt/glibc-2.18

将其安装在其他目录中

问题是我启动configure时出现以下错误

configure:错误:汇编程序太旧,.cfi_personality支持缺失

我想我也必须更新binutils,所以我下载了源代码并将其安装在/opt/binutils-2.26/中以免损坏系统.

但是当我尝试配置glibc时,我仍然遇到同样的错误.

这是我的问题:

如何指定我想用哪个版本的binutil来构建glibc?

编辑:我应该有RTFM,答案是使用'--with-binutils = directory'选项

如果将glopc安装在/opt/glibc-2.18中,怎么能让它成为一个好的glibc版本呢?

仅供我使用python 2.7.11

非常感谢和最诚挚的问候

python glibc centos binutils tensorflow

5
推荐指数
1
解决办法
2049
查看次数