由于错误,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。
我有一个来自 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) 在对此问题的评论中, 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 更改为 …
我正在开发一款普通的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上,它们的名称如下:
但是,在Ubuntu上,名称附有版本号,如下所示:
因此尝试打开"libXfixes.so"会在Ubuntu上失败,尽管lib显然存在.它只附有一个版本号.那我的应用应该如何处理呢?
我应该让我的应用程序首先手动扫描/ usr/lib /以查看我们有哪些库,然后选择合适的库?或者有没有人有更好的主意?
多谢你们,
安迪
我想在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启动我的操作系统:)
当我使用我的工具链(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) 我正在使用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.
任何人都知道这个任务是否存在一些教程?
确实有两个问题与--add-section的使用有关。简单的标题中。根据我的阅读,我还无法弄清楚如何执行--add-section。
要使用add-section,我必须传递一个部分名称。如果我使用现有的节名称,程序将响应“无法添加节'.data':文件格式错误”。也许我只需要传递另一个参数。如果我希望使用新的节名称,则会警告“分配的节'.blob'不在段中”。
现在,除了“不在细分市场”警告之外,我还需要我的功能才能正常工作。我想弄清楚是否存在将这个Blob放入可执行文件的合法方法。我会链接进去,但这不是那么容易,因为我要添加的数据是从可执行文件本身的内容生成的。
第二个问题确实是我关心的问题。给定链接完成后才能计算blob,有没有一种方法可以执行以下操作。
将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会更干净。
更新:只要重新链接在第一个链接所产生的程序部分中没有改变,则最后一种策略可能是可行的。它不是第一次尝试,但是有可能解决它。因此,希望使用--add-section来添加该blob而不是通过第二个链接。
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)
以下编译器使用了相同的结果:
我正在尝试在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
非常感谢和最诚挚的问候