将.init_array部分包含在链接器脚本中会产生不可用的输出
Including .init_array section to Linker script produces unusable output
我尝试将c ++项目移植到RISC-V。该项目已经使用IAR工具链为ARM和Windows成功编译。
对于RISC-V端口,我已经编写了自己的CRT0。S文件,它执行所有初始化以及我自己的链接器脚本。
对于一些小型演示项目,一切都运行良好。 我还可以成功编译和链接项目。问题是当我将.init_array部分添加到链接器脚本时,输出文件从大约 4k 增加到超过 100k。我将这些部分添加到链接器脚本中:
.preinit_array :
{
PROVIDE_HIDDEN (__preinit_array_start = .);
KEEP (*(.preinit_array))
PROVIDE_HIDDEN (__preinit_array_end = .);
} > ram
.init_array :
{
PROVIDE_HIDDEN (__init_array_start = .);
KEEP (*(SORT(.init_array.*)))
KEEP (*(.init_array ))
PROVIDE_HIDDEN (__init_array_end = .);
} > ram
.fini_array :
{
PROVIDE_HIDDEN (__fini_array_start = .);
KEEP (*(SORT(.fini_array.*)))
KEEP (*(.fini_array ))
PROVIDE_HIDDEN (__fini_array_end = .);
} > ram
当我现在尝试将此 ELF 文件加载到 GDB 时,我只是收到错误无寄存器。当我从链接器中删除这些部分时,只要我不使用未加载的静态对象,我就可以成功运行代码。
这种行为有什么解释吗?
我能够确定问题。添加 init 数组部分时,还添加了标准库中的一些静态对象。库正在使用对操作系统的系统调用 (ebreak(。由于我们正在开发裸机系统,因此未捕获呼叫。
解决方案是排除标准库并手动实现delete
运算符。现在它正在完美地工作。
void operator delete(void *p) noexcept
{
free(p);
}
extern "C" void operator delete(void* p, unsigned long c) noexcept
{
operator delete(p); // Same as regular delete
}
相关文章:
- 从C++应用获取PowerShell脚本输出
- 将.init_array部分包含在链接器脚本中会产生不可用的输出
- 如何从 bash 脚本捕获终端输出并将其显示在我的 Qt UI 中?
- 将Python脚本的输出链接到C 程序的输入
- 从c++程序运行shell脚本会自动将shell脚本的输出显示到控制台吗
- 在Qt应用程序中读取python脚本C++输出
- Shell脚本终止程序,但导致无法写入输出文件
- 如何将C++程序的输出用作 Bash 脚本中的变量
- 将C++程序输出与 Python 脚本链接
- CGI 渲染到屏幕外壳脚本输出
- 从C++执行 bash 脚本并读取其输出 ubuntu sdk
- 关闭标准输出和脚本
- 如何通过脚本将输出写入C++中的文本文件
- 将外部进程的输出管道传输到正在运行的脚本C++
- 使用C++或Bash/Shell脚本评估后台linux命令的输出
- 解释R脚本的valgrind输出
- 在QT中获取Python脚本的输出
- 从c++调用Python脚本并使用其输出
- 如何在c++中重定向读取bash脚本的输出
- 从bash脚本返回输出到调用c++函数