Replies: 1 comment 1 reply
-
也遇到过这个问题,我的解决方案是给用户程序编译选项加上-no-pie和-fno-pie。当时也有点纳闷为什么生成的是ELF shared object而不是executable。我猜有可能现在链接中的musl gcc是默认开启生成PIE的,而原来的那个不是。 |
Beta Was this translation helpful? Give feedback.
1 reply
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
-
问题
ucore ch5练习中,在usershell运行ch5_mergetest,会产生如下错误:

ch5_mergetest代码如下:
可以看到ch5_mergetest并未得到待测试程序的名称,因而打印出的目标测试程序名称均为
null
。通过测试发现数组TESTS和FAILES中的数据均为0,于是ch5_mergetest获得的程序名均为空指针,导致错误。
进一步实验发现,ucore用户态程序中包含常量字符串指针的变量,都无法正常初始化(其初始值始终为0),包括
char *[]
类型的全局常量字符串指针数组。char *
类型的全局常量字符串指针。char*[]
类型的常量字符串指针数组大小达到一定值时,也会无法初始化。环境
ucore实验指导中的工具链与qemu。
复现
修改Makefile,将ch5_mergetest添加到ch5的测试程序集(ch5原始Makefile好像并未包括该程序),并在usershell中执行ch5_mergetest;
或者在任一用户程序中创建全局变量
char * str = "waku";
,并在main函数中尝试打印。原因推测
链接器在链接ucore用户态程序时,会把TESTS和FAILS放到名为.data.rel.local的section中,初始化为0,且该段在链接器链接过程中中符号没有重定位。导致最终TESTS、FAILS等数组内容为空。(猜测可能是由于TESTS、FAILS等全局变量引用了常量字符串,被编译器优化为在 运行时 进行重定位,而ucore不提供运行时重定位功能,导致问题发生。

解决办法
在用户程序的链接选项中添加
-static
参数,可以避免这一问题。其他
通过测试发现:
欢迎大家交流讨论,比如也遇到过这个问题或者了解gcc相关文档。😁
Beta Was this translation helpful? Give feedback.
All reactions