Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

R_MERCURY Relocation Types

Addresses apply to ptxas v13.0.88 (CUDA 13.0). VA base 0x400000 (non-PIE).

The 64-entry R_MERCURY_* relocation catalog, decoded byte-exact from the mercury_reloc_info[] table in .rodata at VMA 0x23FF080 (stride 0x40 = 64 B per entry; entries 0..63 carry ELF type codes 0x10000..0x1003F). Entry 64 (type 0x10040) is the first record of the contiguous sass_reloc_info[] (R_CUDA_*) table that follows immediately in .rodata — the two relocation tables are adjacent, which is why the master resolver sub_1CD48C0 indexes Mercury relocs as mercury_reloc_info[r_type − 0x10000].

Each entry's layout is { const char *name (8 B); uint32 handler; action[3] × {uint32 start_bit, num_bits, sym_value, src_start_bit} }. The handler field (NVRH_*) drives the finalizer-vs-driver split: only the PROG_REL family (PROG_REL64/32/32_LO/32_HI plus the byte-lane PROG_REL8_0..56) is NVRH_FINALIZER and is resolved by the Mercury finalizer in place; everything else is deferred to the driver or linker. The sym_value column names the NVRS_* symbol-value code that selects what value gets patched in (full address, low/high half, byte lane, PC-relative delta, unified address, or clear-to-zero).

UNIFIED32_LO (0x1003E) and UNIFIED32_HI (0x1003F) are present only in this build, using sym_value codes 55/56 (NVRS_LOUADDR / NVRS_HIUADDR); older ptxas builds ended the table at R_MERCURY_ABS_PROG_REL64 (0x1003D) followed by the sentinel. The remaining 62 entries are byte-identical across builds.

TypeNameHandlerBit actionsym_value
0x10000R_MERCURY_NONENVRH_NONE(none)NVRS_NONE
0x10001R_MERCURY_G64NVRH_DRIVERbits[0..63]NVRS_ADDR
0x10002R_MERCURY_ABS64NVRH_EITHERbits[0..63]NVRS_ADDR
0x10003R_MERCURY_ABS32NVRH_EITHERbits[0..31]NVRS_ADDR
0x10004R_MERCURY_ABS16NVRH_EITHERbits[0..15]NVRS_ADDR
0x10005R_MERCURY_ABS32_LONVRH_DRIVERbits[0..31]NVRS_LOADDR
0x10006R_MERCURY_ABS32_HINVRH_DRIVERbits[0..31] (>>32)NVRS_HIADDR
0x10007R_MERCURY_PROG_REL64NVRH_FINALIZERbits[0..63]NVRS_ADDR
0x10008R_MERCURY_PROG_REL32NVRH_FINALIZERbits[0..31]NVRS_ADDR
0x10009R_MERCURY_PROG_REL32_LONVRH_FINALIZERbits[0..31]NVRS_ADDR
0x1000aR_MERCURY_PROG_REL32_HINVRH_FINALIZERbits[0..31] (>>32)NVRS_ADDR
0x1000bR_MERCURY_TEX_HEADER_INDEXNVRH_DRIVERbits[0..19]NVRS_HEADER
0x1000cR_MERCURY_SAMP_HEADER_INDEXNVRH_DRIVERbits[20..31]NVRS_HEADER
0x1000dR_MERCURY_SURF_HEADER_INDEXNVRH_DRIVERbits[0..19]NVRS_HEADER
0x1000eR_MERCURY_UNUSED_CLEAR64NVRH_LINKERbits[0..63]NVRS_CLEAR
0x1000fR_MERCURY_FUNC_DESC_64NVRH_DRIVERbits[0..63]NVRS_FDESCA
0x10010R_MERCURY_8_0NVRH_EITHERbits[0..7]NVRS_ADDR8_0
0x10011R_MERCURY_8_8NVRH_EITHERbits[0..7] (>>8)NVRS_ADDR8_8
0x10012R_MERCURY_8_16NVRH_EITHERbits[0..7] (>>16)NVRS_ADDR8_16
0x10013R_MERCURY_8_24NVRH_EITHERbits[0..7] (>>24)NVRS_ADDR8_24
0x10014R_MERCURY_8_32NVRH_EITHERbits[0..7] (>>32)NVRS_ADDR8_32
0x10015R_MERCURY_8_40NVRH_EITHERbits[0..7] (>>40)NVRS_ADDR8_40
0x10016R_MERCURY_8_48NVRH_EITHERbits[0..7] (>>48)NVRS_ADDR8_48
0x10017R_MERCURY_8_56NVRH_EITHERbits[0..7] (>>56)NVRS_ADDR8_56
0x10018R_MERCURY_G8_0NVRH_DRIVERbits[0..7]NVRS_GADDR8_0
0x10019R_MERCURY_G8_8NVRH_DRIVERbits[0..7] (>>8)NVRS_GADDR8_8
0x1001aR_MERCURY_G8_16NVRH_DRIVERbits[0..7] (>>16)NVRS_GADDR8_16
0x1001bR_MERCURY_G8_24NVRH_DRIVERbits[0..7] (>>24)NVRS_GADDR8_24
0x1001cR_MERCURY_G8_32NVRH_DRIVERbits[0..7] (>>32)NVRS_GADDR8_32
0x1001dR_MERCURY_G8_40NVRH_DRIVERbits[0..7] (>>40)NVRS_GADDR8_40
0x1001eR_MERCURY_G8_48NVRH_DRIVERbits[0..7] (>>48)NVRS_GADDR8_48
0x1001fR_MERCURY_G8_56NVRH_DRIVERbits[0..7] (>>56)NVRS_GADDR8_56
0x10020R_MERCURY_FUNC_DESC_8_0NVRH_DRIVERbits[0..7]NVRS_FDESC8_0
0x10021R_MERCURY_FUNC_DESC_8_8NVRH_DRIVERbits[0..7] (>>8)NVRS_FDESC8_8
0x10022R_MERCURY_FUNC_DESC_8_16NVRH_DRIVERbits[0..7] (>>16)NVRS_FDESC8_16
0x10023R_MERCURY_FUNC_DESC_8_24NVRH_DRIVERbits[0..7] (>>24)NVRS_FDESC8_24
0x10024R_MERCURY_FUNC_DESC_8_32NVRH_DRIVERbits[0..7] (>>32)NVRS_FDESC8_32
0x10025R_MERCURY_FUNC_DESC_8_40NVRH_DRIVERbits[0..7] (>>40)NVRS_FDESC8_40
0x10026R_MERCURY_FUNC_DESC_8_48NVRH_DRIVERbits[0..7] (>>48)NVRS_FDESC8_48
0x10027R_MERCURY_FUNC_DESC_8_56NVRH_DRIVERbits[0..7] (>>56)NVRS_FDESC8_56
0x10028R_MERCURY_ABS_PROG_REL32_LONVRH_DRIVERbits[0..31]NVRS_PCREL
0x10029R_MERCURY_ABS_PROG_REL32_HINVRH_DRIVERbits[0..31] (>>32)NVRS_PCREL
0x1002aR_MERCURY_PROG_REL8_0NVRH_FINALIZERbits[0..7]NVRS_ADDR8_0
0x1002bR_MERCURY_PROG_REL8_8NVRH_FINALIZERbits[0..7] (>>8)NVRS_ADDR8_8
0x1002cR_MERCURY_PROG_REL8_16NVRH_FINALIZERbits[0..7] (>>16)NVRS_ADDR8_16
0x1002dR_MERCURY_PROG_REL8_24NVRH_FINALIZERbits[0..7] (>>24)NVRS_ADDR8_24
0x1002eR_MERCURY_PROG_REL8_32NVRH_FINALIZERbits[0..7] (>>32)NVRS_ADDR8_32
0x1002fR_MERCURY_PROG_REL8_40NVRH_FINALIZERbits[0..7] (>>40)NVRS_ADDR8_40
0x10030R_MERCURY_PROG_REL8_48NVRH_FINALIZERbits[0..7] (>>48)NVRS_ADDR8_48
0x10031R_MERCURY_PROG_REL8_56NVRH_FINALIZERbits[0..7] (>>56)NVRS_ADDR8_56
0x10032R_MERCURY_UNIFIEDNVRH_DRIVERbits[0..31]NVRS_UADDR
0x10033R_MERCURY_UNIFIED_32NVRH_DRIVERbits[0..63]NVRS_UADDR
0x10034R_MERCURY_UNIFIED_8_0NVRH_DRIVERbits[0..7]NVRS_UADDR8_0
0x10035R_MERCURY_UNIFIED_8_8NVRH_DRIVERbits[0..7] (>>8)NVRS_UADDR8_8
0x10036R_MERCURY_UNIFIED_8_16NVRH_DRIVERbits[0..7] (>>16)NVRS_UADDR8_16
0x10037R_MERCURY_UNIFIED_8_24NVRH_DRIVERbits[0..7] (>>24)NVRS_UADDR8_24
0x10038R_MERCURY_UNIFIED_8_32NVRH_DRIVERbits[0..7] (>>32)NVRS_UADDR8_32
0x10039R_MERCURY_UNIFIED_8_40NVRH_DRIVERbits[0..7] (>>40)NVRS_UADDR8_40
0x1003aR_MERCURY_UNIFIED_8_48NVRH_DRIVERbits[0..7] (>>48)NVRS_UADDR8_48
0x1003bR_MERCURY_UNIFIED_8_56NVRH_DRIVERbits[0..7] (>>56)NVRS_UADDR8_56
0x1003cR_MERCURY_ABS_PROG_REL32NVRH_DRIVERbits[0..31]NVRS_PCREL
0x1003dR_MERCURY_ABS_PROG_REL64NVRH_DRIVERbits[0..63]NVRS_PCREL
0x1003eR_MERCURY_UNIFIED32_LONVRH_DRIVERbits[0..31]NVRS_LOUADDR
0x1003fR_MERCURY_UNIFIED32_HINVRH_DRIVERbits[0..31] (>>32)NVRS_HIUADDR

NVRS_* symbol-value codes

The action.sym_value integer selects what the bit-patcher (sub_1CD34E0, extract sub_1CD33F0 / insert sub_1CD3330) computes for the field. The codes referenced by the Mercury table:

CodeNamePatch semantics
0NVRS_NONEno-op (ignore action)
1NVRS_ADDRsym + addend; full-width insert (width-64 @ bit 0 is a whole-qword copy)
3NVRS_HEADERtex/samp/surf header index bind (default path, not the bit-patcher)
6NVRS_LOADDRlow 32 bits of (sym + addend)
7NVRS_HIADDRhigh 32 bits ((sym + addend) >> 32)
15NVRS_FDESCAaddress of the entry-function descriptor
16NVRS_PCREL(signed)(sym_value − reloc_offset)
20NVRS_CLEARclear the field to zero (symbol deleted)
22–29NVRS_ADDR8_0..56byte lane n of the address (mask 0xFF, shift 8n)
30–37NVRS_GADDR8_0..56byte lane n of the generic (window-relative) address
38–45NVRS_FDESC8_0..56byte lane n of the function descriptor
46NVRS_UADDRunified address of symbol
47–54NVRS_UADDR8_0..56byte lane n of the unified address
55NVRS_LOUADDRlow 32 bits of the unified address
56NVRS_HIUADDRhigh 32 bits of the unified address