首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >汇编弱符号未按预期工作(I)

汇编弱符号未按预期工作(I)
EN

Stack Overflow用户
提问于 2022-08-12 14:56:15
回答 1查看 106关注 0票数 0

我正在与riscv-corev32-elf-gcc交叉编译。

在第一个文件'generic.S‘中,我有以下代码:

代码语言:javascript
运行
复制
.section .text.handlers
.weak u_sw_irq_handler
.weak __no_irq_handler

.section .vectors, "ax"
vector_table:
    jal x0, u_sw_irq_handler 
    jal x0, __no_irq_handler     
    jal x0, __no_irq_handler
    ...


.section .text
reset_handler:
    la t0, vector_table
    csrw mtvec, t0

在第二个文件'custom.S‘中,我有以下代码:

代码语言:javascript
运行
复制
.section .text.handlers
.<x> u_sw_irq_handler
.<x> __no_irq_handler

.section .vectors, "ax"
vector_table:
    jal x0, u_sw_irq_handler 
    jal x0, ISR_1_handler     
    jal x0, ISR_2_handler
    ...

<x>要么是global要么是local

global时,这是反汇编的(部分)结果:

代码语言:javascript
运行
复制
00001000 <vector_table>:
    1000:   7760d06f            j   e776 <u_sw_irq_handler>
    1004:   1880706f            j   81cc <ISR_1_handler>
    1008:   1e40706f            j   822c <ISR_2_handler>
    ...
    1084:   7760d06f            j   e776 <u_sw_irq_handler>
    1088:   7320d06f            j   e736 <__no_irq_handler>
    108c:   72e0d06f            j   e736 <__no_irq_handler>
    ...


00001108 <reset_handler>:
    1108:   00000297            auipc   t0,0x0
    110c:   f7c28293            addi    t0,t0,-264 # 1000 <vector_table>
    1110:   30529073            csrw    mtvec,t0

local时,这是反汇编的(部分)结果:

代码语言:javascript
运行
复制
00001000 <vector_table>:
    1000:   7760d06f            j   e776 <u_sw_irq_handler>
    1004:   1880706f            j   81cc <ISR_1_handler>
    1008:   1e40706f            j   822c <ISR_2_handler>
    ...

00001084 <vector_table>:
    1084:   7760d06f            j   e776 <u_sw_irq_handler>
    1088:   7320d06f            j   e736 <__no_irq_handler>
    108c:   72e0d06f            j   e736 <__no_irq_handler>
    ...



00001108 <reset_handler>:
    1108:   00000297            auipc   t0,0x0
    110c:   f7c28293            addi    t0,t0,-132 # 1084 <vector_table>
    1110:   30529073            csrw    mtvec,t0

但这不是我想要的

我希望在没有vector_table的其他定义的情况下使用泛型定义

我希望泛型定义被custom.S定义覆盖(如果存在),并希望generic.S中的vector_table中的reset_handler加载该

  • 的自定义地址

使用“全局”的

  • 是我想要的更接近的值,但是vector_table在最后一个向量

之后继续使用jal x0, ...

使用“本地”的

  • --在reset_handler中调用的vector_table --将是通用的,而不是自定义的。

编辑:对不起,我错过了重置处理程序反汇编的日志。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-08-13 06:01:00

程序集weak符号不像我预期的那样工作

weak的工作方式与您想象的不同:

如果符号不存在于另一个对象文件中,并且它使符号本身(!),则weak生成一个符号全局。如果它存在于另一个对象文件中,则消失。

示例(对不起,我的示例是x86,因为我不知道riscv32):

代码语言:javascript
运行
复制
.weak some_irq_handler
.weak some_other_irq_handler

vector_table:
    jmp some_irq_handler
    jmp some_other_irq_handler

some_irq_handler:
    iret

some_other_irq_handler:
    iret

如果没有其他对象文件包含.global some_irq_handler.global some_other_irq_handler,则.weak行几乎与.global行具有相同的效果。

但是,如果另一个对象文件包含这两个符号,则上面的示例或多或少等于:

代码语言:javascript
运行
复制
vector_table:
    # This symbol is defined in another object file
    jmp some_irq_handler
    # This symbol is defined in another object file
    jmp some_other_irq_handler

    # The code of "some_irq_handler" is still
    # present; only the label "some_irq_handler:"
    # has been removed by the linker!
    iret

    iret

# -- Another object file --
some_irq_handler:
    ...

我希望通用定义被custom.S定义覆盖,如果它存在的话.

Case 1vector_table需要而不是位于内存中的某个地址:

在本例中,您可以通过以下方式完成此操作:

代码语言:javascript
运行
复制
.weak vector_table

vector_table:
    jmp no_interrupt
    jmp no_interrupt
    ...

如果项目中存在另一个向量表,则生成的代码(链接后)如下所示:

代码语言:javascript
运行
复制
# -- "weak" object file --
# vector_table: - Label removed by the linker
# but the table itself is still there
    jmp no_interrupt
    jmp no_interrupt
    ...
# -- "overwriting" object file --
vector_table:
    jmp interrupt1
    jmp interrupt2
    ...

Case 2vector_table 需要将定位在内存中的某个地址:

在本例中,您可以通过以下方式完成该操作:

代码语言:javascript
运行
复制
.weak interrupt1
.weak interrupt2
...

vector_table:
   jmp interrupt1
   jmp interrupt2
   ...

__no_irq_handler:
interrupt1:
interrupt2:
   ...
interrupt256:
   iret

您将永远不会用另一个中断向量表覆盖“泛型”中断向量表,但只覆盖符号interrupt<n>

代码语言:javascript
运行
复制
.global interrupt2

interrupt2:
    mov al, 0x1234
    out 0xE4, ax
    mov al, 0x20
    out 0x20, al
    iret

(这也适用于C编写的代码。因为C编译器默认使函数为.global而不是.weak,所以C写函数覆盖.weak函数。)

生成的代码将如下所示:

代码语言:javascript
运行
复制
# -- "weak" object file --
vector_table:
   jmp interrupt1
   jmp interrupt2
   ...

__no_irq_handler:
interrupt1:
# interrupt2: - Label removed by the linker
interrupt3:
   ...
interrupt256:
   iret

# -- "overwriting" object file --
interrupt2:
    mov al, 0x1234
    out 0xE4, ax
    mov al, 0x20
    out 0x20, al
    iret
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73336063

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档