繁体   English   中英

与链接器脚本链接时无法执行可执行文件

[英]cannot execute the executable when linked with linker scripts

我是链接器脚本概念的新手。 所以我尝试使用简单的 c 程序和链接器脚本以及内存文件。

我尝试为 ac 程序传递自定义链接器脚本,当我查看生成的内存文件时,我能够看到初始化的变量放置在链接器脚本中提到的地址处。

但问题是我无法执行为 c 程序生成的可执行文件

这是我的 c 文件simpleHello.c

#include<stdio.h>
int g1 = 100;
int main(int argc , char *argv[])
{
printf("value of g1 is %d",g1);
return 0;
}

这是我的链接器脚本文件名称linker.ld

ENTRY(main)
SECTIONS
{
  . = ALIGN(4);
  . = 0x0000000000400410;
  .text : { *(.text) }
  . = 0x0000000000601038;
  .data : { *(.data) }
  .bss : { *(.bss) }
}

我正在运行以下命令

clang simpleHello.c -g -Wl,-emain,-Map=o.map,-Tlinker.ld -ffreestanding -nostartfiles -nodefaultlibs -L/usr/lib/x86_64-linux-gnu -lc -o simple

如果我运行./simple

分段错误(核心转储)

所以我用 gdb 调试了可执行文件,我得到了这个。

gdb ./simple

Reading symbols from ./simple...done.
(gdb) b main
Breakpoint 1 at 0x40041f: file simpleHello.c, line 9.
(gdb) r
Starting program: Desktop/Memory-Map/programs/simple 

Breakpoint 1, main (argc=-134225560, argv=0x1) at simpleHello.c:9
9   printf("value of g1 is %d",g1);
(gdb) bt
#0  main (argc=-134225560, argv=0x1) at simpleHello.c:9
(gdb) 

因此,problem 是带有 argc 和 argv 或带有我通过的链接器文件的。?

请为这个问题提出一些解决方案。

  1. 可执行文件的链接描述文件并没有那么简单。 您需要为应用程序和操作系统提供各种部分来加载和运行应用程序。

    请参阅默认链接器脚本:

    • 在 Linux 上,它们位于/usr/lib/ldscripts - 至少在我尝试的发行版中。
    • 在 Windows 上,它们位于<your-installation-path>\\mingw64\\x86_64-w64-mingw32\\lib\\ldscripts - 至少在我尝试的安装中。
  2. 您在脚本中为.text放置了诸如0x0000000000400410类的硬编码地址。 您不能这样做,因为我们的临时操作系统自行决定在哪里加载这些部分。

因此,如果您喜欢使用链接器脚本,我建议您复制系统的链接器脚本之一并对其进行编辑。 你需要哪一种,我不知道。

可能有一些选项可以让链接器显示它使用的是哪一个。 您可以从标准编译命令和选项-v ,这将为您提供很多详细信息。 但是您肯定需要阅读链接器的文档。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM