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_CUDA Relocation Catalog

Complete reference table of all 117 canonical R_CUDA relocation type names extracted from nvlink v13.0.88, indexed across 182 total descriptor rows (117 standard + 65 attribute). The raw nvlink_strings.json pool contains 119 R_CUDA string entries -- 117 unique names plus two trailing-whitespace duplicates of R_CUDA_UNIFIED_8_0 and R_CUDA_UNIFIED_8_8 (see Confidence Assessment). Types are organized into two descriptor tables: the standard table at off_1D37600 (117 entries, indices 0--116) and the attribute table at off_1D371E0 (65 entries, indices 0x10000--0x10040). See R_CUDA Relocations for the relocation engine, descriptor format, action types, and architecture class system.

Standard Table (off_1D37600)

117 entries. Index = raw r_type value in .rela.* sections. Bit width and bit position are derived from the type name and confirmed against the 64-byte descriptors at off_1D3DBE0.

IndexNameTypeBit WidthBit Position
0R_CUDA_NONEsentinel----
1R_CUDA_32data320
2R_CUDA_64data640
3R_CUDA_G32global320
4R_CUDA_G64global640
5R_CUDA_ABS32_26abs-instr3226
6R_CUDA_TEX_HEADER_INDEXtexturespecialspecial
7R_CUDA_SAMP_HEADER_INDEXsamplerspecialspecial
8R_CUDA_SURF_HW_DESCsurfacespecialspecial
9R_CUDA_SURF_HW_SW_DESCsurfacespecialspecial
10R_CUDA_ABS32_LO_26abs-instr1626
11R_CUDA_ABS32_HI_26abs-instr1626
12R_CUDA_ABS32_23abs-instr3223
13R_CUDA_ABS32_LO_23abs-instr1623
14R_CUDA_ABS32_HI_23abs-instr1623
15R_CUDA_ABS24_26abs-instr2426
16R_CUDA_ABS24_23abs-instr2423
17R_CUDA_ABS16_26abs-instr1626
18R_CUDA_ABS16_23abs-instr1623
19R_CUDA_TEX_SLOTtexturespecialspecial
20R_CUDA_SAMP_SLOTsamplerspecialspecial
21R_CUDA_SURF_SLOTsurfacespecialspecial
22R_CUDA_TEX_BINDLESSOFF13_32bindless1332
23R_CUDA_TEX_BINDLESSOFF13_47bindless1347
24R_CUDA_CONST_FIELD19_28const1928
25R_CUDA_CONST_FIELD19_23const1923
26R_CUDA_TEX_SLOT9_49texture949
27R_CUDA_6_31misc631
28R_CUDA_2_47misc247
29R_CUDA_TEX_BINDLESSOFF13_41bindless1341
30R_CUDA_TEX_BINDLESSOFF13_45bindless1345
31R_CUDA_FUNC_DESC32_23func-desc3223
32R_CUDA_FUNC_DESC32_LO_23func-desc1623
33R_CUDA_FUNC_DESC32_HI_23func-desc1623
34R_CUDA_FUNC_DESC_32func-desc320
35R_CUDA_FUNC_DESC_64func-desc640
36R_CUDA_CONST_FIELD21_26const2126
37R_CUDA_QUERY_DESC21_37misc2137
38R_CUDA_CONST_FIELD19_26const1926
39R_CUDA_CONST_FIELD21_23const2123
40R_CUDA_PCREL_IMM24_26pc-rel2426
41R_CUDA_PCREL_IMM24_23pc-rel2423
42R_CUDA_ABS32_20abs-instr3220
43R_CUDA_ABS32_LO_20abs-instr1620
44R_CUDA_ABS32_HI_20abs-instr1620
45R_CUDA_ABS24_20abs-instr2420
46R_CUDA_ABS16_20abs-instr1620
47R_CUDA_FUNC_DESC32_20func-desc3220
48R_CUDA_FUNC_DESC32_LO_20func-desc1620
49R_CUDA_FUNC_DESC32_HI_20func-desc1620
50R_CUDA_CONST_FIELD19_20const1920
51R_CUDA_BINDLESSOFF13_36bindless1336
52R_CUDA_SURF_HEADER_INDEXsurfacespecialspecial
53R_CUDA_INSTRUCTION64instr640
54R_CUDA_CONST_FIELD21_20const2120
55R_CUDA_ABS32_32abs-instr3232
56R_CUDA_ABS32_LO_32abs-instr1632
57R_CUDA_ABS32_HI_32abs-instr1632
58R_CUDA_ABS47_34abs-instr4734
59R_CUDA_ABS16_32abs-instr1632
60R_CUDA_ABS24_32abs-instr2432
61R_CUDA_FUNC_DESC32_32func-desc3232
62R_CUDA_FUNC_DESC32_LO_32func-desc1632
63R_CUDA_FUNC_DESC32_HI_32func-desc1632
64R_CUDA_CONST_FIELD19_40const1940
65R_CUDA_BINDLESSOFF14_40bindless1440
66R_CUDA_CONST_FIELD21_38const2138
67R_CUDA_INSTRUCTION128instr1280
68R_CUDA_YIELD_OPCODE9_0yield90
69R_CUDA_YIELD_CLEAR_PRED4_87yield487
70R_CUDA_32_LOdata160
71R_CUDA_32_HIdata160
72R_CUDA_UNUSED_CLEAR32clear320
73R_CUDA_UNUSED_CLEAR64clear640
74R_CUDA_ABS24_40abs-instr2440
75R_CUDA_ABS55_16_34abs-instr5534
76R_CUDA_8_0byte80
77R_CUDA_8_8byte88
78R_CUDA_8_16byte816
79R_CUDA_8_24byte824
80R_CUDA_8_32byte832
81R_CUDA_8_40byte840
82R_CUDA_8_48byte848
83R_CUDA_8_56byte856
84R_CUDA_G8_0global80
85R_CUDA_G8_8global88
86R_CUDA_G8_16global816
87R_CUDA_G8_24global824
88R_CUDA_G8_32global832
89R_CUDA_G8_40global840
90R_CUDA_G8_48global848
91R_CUDA_G8_56global856
92R_CUDA_FUNC_DESC_8_0func-desc80
93R_CUDA_FUNC_DESC_8_8func-desc88
94R_CUDA_FUNC_DESC_8_16func-desc816
95R_CUDA_FUNC_DESC_8_24func-desc824
96R_CUDA_FUNC_DESC_8_32func-desc832
97R_CUDA_FUNC_DESC_8_40func-desc840
98R_CUDA_FUNC_DESC_8_48func-desc848
99R_CUDA_FUNC_DESC_8_56func-desc856
100R_CUDA_ABS20_44abs-instr2044
101R_CUDA_SAMP_HEADER_INDEX_0samplerspecialspecial
102R_CUDA_UNIFIEDunifiedspecialspecial
103R_CUDA_UNIFIED_32unified320
104R_CUDA_UNIFIED_8_0unified80
105R_CUDA_UNIFIED_8_8unified88
106R_CUDA_UNIFIED_8_16unified816
107R_CUDA_UNIFIED_8_24unified824
108R_CUDA_UNIFIED_8_32unified832
109R_CUDA_UNIFIED_8_40unified840
110R_CUDA_UNIFIED_8_48unified848
111R_CUDA_UNIFIED_8_56unified856
112R_CUDA_UNIFIED32_LO_32unified1632
113R_CUDA_UNIFIED32_HI_32unified1632
114R_CUDA_ABS56_16_34abs-instr5634
115R_CUDA_CONST_FIELD22_37const2237
116R_CUDA_NONE_LASTsentinel----

Attribute Table (off_1D371E0)

65 entries. Attribute relocations apply to .nv.info.* metadata sections rather than instruction streams. The encoded r_type in ELF is 0x10000 + index (e.g., attribute index 3 = r_type 0x10003). The attribute table reuses a subset of the same type names as the standard table but with different 64-byte descriptors.

The attribute table entries are not individually named in the binary -- they share string pointers with the standard table. The following mapping lists the 65 attribute indices and the standard-table name each one references. Indices not listed here (gaps) use R_CUDA_NONE.

Attr Indexr_typeShared NameType
00x10000R_CUDA_NONEsentinel
10x10001R_CUDA_32data
20x10002R_CUDA_64data
30x10003R_CUDA_G32global
40x10004R_CUDA_G64global
50x10005R_CUDA_ABS32_26abs-instr
60x10006R_CUDA_TEX_HEADER_INDEXtexture
70x10007R_CUDA_SAMP_HEADER_INDEXsampler
80x10008R_CUDA_SURF_HW_DESCsurface
90x10009R_CUDA_SURF_HW_SW_DESCsurface
100x1000AR_CUDA_ABS32_LO_26abs-instr
110x1000BR_CUDA_ABS32_HI_26abs-instr
120x1000CR_CUDA_ABS32_23abs-instr
130x1000DR_CUDA_ABS32_LO_23abs-instr
140x1000ER_CUDA_ABS32_HI_23abs-instr
150x1000FR_CUDA_ABS24_26abs-instr
160x10010R_CUDA_ABS24_23abs-instr
170x10011R_CUDA_ABS16_26abs-instr
180x10012R_CUDA_ABS16_23abs-instr
190x10013R_CUDA_TEX_SLOTtexture
200x10014R_CUDA_SAMP_SLOTsampler
210x10015R_CUDA_SURF_SLOTsurface
220x10016R_CUDA_TEX_BINDLESSOFF13_32bindless
230x10017R_CUDA_TEX_BINDLESSOFF13_47bindless
240x10018R_CUDA_CONST_FIELD19_28const
250x10019R_CUDA_CONST_FIELD19_23const
260x1001AR_CUDA_TEX_SLOT9_49texture
270x1001BR_CUDA_6_31misc
280x1001CR_CUDA_2_47misc
290x1001DR_CUDA_TEX_BINDLESSOFF13_41bindless
300x1001ER_CUDA_TEX_BINDLESSOFF13_45bindless
310x1001FR_CUDA_FUNC_DESC32_23func-desc
320x10020R_CUDA_FUNC_DESC32_LO_23func-desc
330x10021R_CUDA_FUNC_DESC32_HI_23func-desc
340x10022R_CUDA_FUNC_DESC_32func-desc
350x10023R_CUDA_FUNC_DESC_64func-desc
360x10024R_CUDA_CONST_FIELD21_26const
370x10025R_CUDA_QUERY_DESC21_37misc
380x10026R_CUDA_CONST_FIELD19_26const
390x10027R_CUDA_CONST_FIELD21_23const
400x10028R_CUDA_PCREL_IMM24_26pc-rel
410x10029R_CUDA_PCREL_IMM24_23pc-rel
420x1002AR_CUDA_ABS32_20abs-instr
430x1002BR_CUDA_ABS32_LO_20abs-instr
440x1002CR_CUDA_ABS32_HI_20abs-instr
450x1002DR_CUDA_ABS24_20abs-instr
460x1002ER_CUDA_ABS16_20abs-instr
470x1002FR_CUDA_FUNC_DESC32_20func-desc
480x10030R_CUDA_FUNC_DESC32_LO_20func-desc
490x10031R_CUDA_FUNC_DESC32_HI_20func-desc
500x10032R_CUDA_CONST_FIELD19_20const
510x10033R_CUDA_BINDLESSOFF13_36bindless
520x10034R_CUDA_SURF_HEADER_INDEXsurface
530x10035R_CUDA_INSTRUCTION64instr
540x10036R_CUDA_CONST_FIELD21_20const
550x10037R_CUDA_ABS32_32abs-instr
560x10038R_CUDA_ABS32_LO_32abs-instr
570x10039R_CUDA_ABS32_HI_32abs-instr
580x1003AR_CUDA_ABS47_34abs-instr
590x1003BR_CUDA_ABS16_32abs-instr
600x1003CR_CUDA_ABS24_32abs-instr
610x1003DR_CUDA_FUNC_DESC32_32func-desc
620x1003ER_CUDA_FUNC_DESC32_LO_32func-desc
630x1003FR_CUDA_FUNC_DESC32_HI_32func-desc
640x10040R_CUDA_CONST_FIELD19_40const

Category Summary

TypeCount (standard)Description
abs-instr25Absolute address patched into instruction bit-fields
bindless6Bindless texture/surface offset
byte8Byte-granularity data patching (R_CUDA_8_*)
clear2Zero-fill unused fields
const10Constant bank offset (R_CUDA_CONST_FIELD*)
data4Full-width data-section relocations (32, 64, 32_HI, 32_LO)
func-desc19Function descriptor reference
global10Global memory address (R_CUDA_G*)
instr2Whole-instruction replacement (64-bit or 128-bit)
misc3Query descriptor, narrow-field encodings
pc-rel2PC-relative branch offset
sampler3Sampler header/slot binding
sentinel2No-op / end-of-range marker
surface4Surface header/slot/descriptor binding
texture3Texture header/slot binding
unified12Unified descriptor/function table reference
yield2YIELD-to-NOP instruction conversion
Total117

Descriptor Byte Layout

The 117 standard and 65 attribute descriptors are stored as 64-byte fixed records in .rodata. Both the standard table at off_1D3DBE0 and the attribute table at off_1D3CBE0 share the same layout; the relocation engine picks one or the other from the r_type & 0x10000 attribute bit (see sub_469620 lines 26--38). This section provides the byte-for-byte decode that confirms the three-action-slot model described in R_CUDA Relocations § Descriptor Format.

Verified byte layout

offset  size  field             role
------  ----  ----------------  ----------------------------------------------
 0..7    8    name_ptr          LE pointer to type-name string in .rodata
 8..11   4    apply_class       1=instr bit-field, 2=descriptor/global, 4=data,
                                0=sentinel, 0xFF00=poison terminator
12..15   4    slot0.bit_offset  primary bit position to patch
16..19   4    slot0.bit_width   primary bit-width to patch
20..23   4    slot0.action      action enum (0..56)
24..27   4    slot0.aux         per-action immediate (HI-byte addend, byte offset)
28..43  16    slot1             second action: (bit_offset, bit_width, action, aux)
44..59  16    slot2             third action:  (bit_offset, bit_width, action, aux)
60..63   4    sentinel          zero -- terminates the action-slot iterator

The 12-byte header in r-cuda-relocations.md § Descriptor Format corresponds to the name_ptr (treated as two consumed _DWORDs field_0/field_1 by sub_46ADC0) followed by the apply_class dword. This catalog labels the first 8 bytes as a single name pointer because every observed value is a valid .rodata string address.

ASCII byte map

byte:   0  1  2  3  4  5  6  7   8  9  A  B   C  D  E  F  10 11 12 13  14 15 16 17
       [ name_ptr (qword)     ] [apply_class] [slot0.boff] [slot0.bwid] [slot0.act ]

byte:  18 19 1A 1B  1C 1D 1E 1F  20 21 22 23  24 25 26 27  28 29 2A 2B  2C 2D 2E 2F
       [slot0.aux ] [slot1.boff] [slot1.bwid] [slot1.act ] [slot1.aux ] [slot2.boff]

byte:  30 31 32 33  34 35 36 37  38 39 3A 3B  3C 3D 3E 3F
       [slot2.bwid] [slot2.act ] [slot2.aux ] [ sentinel ]

apply_class enum (dword at byte 8)

ValueMeaningCountExamples
0sentinel1R_CUDA_NONE (idx 0)
1instruction-stream bit-field patch39R_CUDA_ABS24_26, R_CUDA_CONST_FIELD19_28, R_CUDA_PCREL_IMM24_26, R_CUDA_YIELD_OPCODE9_0, R_CUDA_UNUSED_CLEAR32
2descriptor / global / func-desc / unified / instr-replacement52R_CUDA_G32, R_CUDA_TEX_HEADER_INDEX, R_CUDA_FUNC_DESC_32, R_CUDA_INSTRUCTION64, R_CUDA_UNIFIED
4data-section byte / word patch24R_CUDA_32, R_CUDA_64, R_CUDA_ABS32_26, R_CUDA_8_0..R_CUDA_8_56
0xFF00poison terminator1R_CUDA_NONE_LAST (idx 116) -- diagonal 0xFF marker

This enum is not the action selector; it is a coarse classifier consumed by the dispatcher in sub_4698A0 and sub_469790 that decides which top-level patch path to take. The fine-grained operation is encoded in slot0.action.

action enum (dword at byte 20)

Twenty-three distinct action codes appear in the standard table. The bitmask test in sub_469620 line 46 (_bittest64(0x3FFFE002C6, action)) gates the symbol-resolution branch on actions {1, 2, 6, 7, 9, 17, 18, 19, 20, 21, 22, ..., 33, 37} -- the entries that need late symbol fix-up.

ActionBehaviorRepresentative entries
0no-opR_CUDA_NONE (0)
1absolute address into (bit_offset, bit_width)R_CUDA_32, R_CUDA_ABS32_26, R_CUDA_ABS20_44
2global-segment addressR_CUDA_G32, R_CUDA_G64
3texture/sampler header indexR_CUDA_TEX_HEADER_INDEX, R_CUDA_SAMP_HEADER_INDEX_0
4--5surface descriptor (HW-only / HW+SW)R_CUDA_SURF_HW_DESC, R_CUDA_SURF_HW_SW_DESC
6low 16 bits of 32-bit absoluteR_CUDA_ABS32_LO_26, R_CUDA_32_LO
7high 16 bits of 32-bit absolute (aux = 0x20)R_CUDA_ABS32_HI_26, R_CUDA_32_HI
8texture/sampler/surface slotR_CUDA_TEX_SLOT, R_CUDA_TEX_SLOT9_49
9SHIFTED_2 ((S + A) >> 2); reused as the leading slot for split-field bindless / constant-bank / wide-immediate types (R_CUDA_TEX_BINDLESSOFF13_32, R_CUDA_CONST_FIELD19_28, R_CUDA_ABS55_16_34). See R_CUDA Relocations § Action Types for the engine semantics.R_CUDA_TEX_BINDLESSOFF13_32, R_CUDA_CONST_FIELD19_28
10, 11continuation pieces of a split-field referenceseen only in slot1/slot2 of R_CUDA_CONST_FIELD*
12--14function-descriptor 32-bit (full / LO / HI)R_CUDA_FUNC_DESC32_23, ..._LO_23, ..._HI_23
15function-descriptor 32/64 rawR_CUDA_FUNC_DESC_32, R_CUDA_FUNC_DESC_64
16PC-relative branch offsetR_CUDA_PCREL_IMM24_26, R_CUDA_PCREL_IMM24_23
17whole-instruction replacementR_CUDA_INSTRUCTION64, R_CUDA_INSTRUCTION128
18YIELD opcode rewriteR_CUDA_YIELD_OPCODE9_0
19YIELD-clear-predicate rewriteR_CUDA_YIELD_CLEAR_PRED4_87
20zero-fill (UNUSED_CLEAR)R_CUDA_UNUSED_CLEAR32, R_CUDA_UNUSED_CLEAR64
21 (0x15)piece_cont -- second piece of a split-field type, pairs with a leading action-9 slotR_CUDA_ABS55_16_34, R_CUDA_ABS56_16_34
22--298-bit data patches at byte offsets 0, 8, ..., 56R_CUDA_8_0 .. R_CUDA_8_56
30--378-bit global patchesR_CUDA_G8_0 .. R_CUDA_G8_56
38--458-bit func-desc patchesR_CUDA_FUNC_DESC_8_0 .. R_CUDA_FUNC_DESC_8_56
46unified descriptor fullR_CUDA_UNIFIED, R_CUDA_UNIFIED_32
47--54unified 8-bit patchesR_CUDA_UNIFIED_8_0 .. R_CUDA_UNIFIED_8_56
55--56unified-32 LO / HI 16-bit piecesR_CUDA_UNIFIED32_LO_32, R_CUDA_UNIFIED32_HI_32

Slot usage statistics

Of the 117 standard descriptors:

  • 108 entries use slot 0 only -- slot 1 and slot 2 are zero, and only one patch action runs.
  • 8 entries use slot 0 + slot 1 -- multi-piece encodings split across two bit ranges.
  • 1 entry (R_CUDA_CONST_FIELD19_28) uses all three slots: 14 bits at position 28, plus 4 bits at position 42, plus 1 bit at position 26.

The action engine in sub_468760 iterates slot0 → slot1 → slot2 → sentinel, applying each non-zero action in turn. A zero action byte in any slot is skipped, not treated as a real type-zero patch.

Decoded sample entries

The following entries were byte-decoded against nvlink_rodata.bin (rodata offset 0xBA40, equivalent to RVA 0x1D3DBE0):

IdxNamename_ptrapply_classslot0 (boff, bwid, act, aux)slot1 / slot2
0R_CUDA_NONE0x1D35F600(0, 0, 0, 0)--
1R_CUDA_320x1D35F6C4(0, 32, 1, 0)--
4R_CUDA_G640x1D35F8B2(0, 64, 2, 0)--
5R_CUDA_ABS32_260x1D35F964(26, 32, 1, 0)--
11R_CUDA_ABS32_HI_260x1D360154(26, 32, 7, 32)--
24R_CUDA_CONST_FIELD19_280x1D361081(28, 14, 9, 0)slot1=(42, 4, 10, 0); slot2=(26, 1, 11, 0)
34R_CUDA_FUNC_DESC_320x1D361E42(0, 32, 15, 0)--
53R_CUDA_INSTRUCTION640x1D3637E2(0, 64, 17, 0)--
67R_CUDA_INSTRUCTION1280x1D364A12(0, 128, 17, 0)--
68R_CUDA_YIELD_OPCODE9_00x1D364B71(0, 9, 18, 0)--
75R_CUDA_ABS55_16_340x1D365402(16, 8, 9, 2)slot1=(34, 47, 21, 10) -- 8 + 47 = 55 bits
76R_CUDA_8_00x1D365534(0, 8, 22, 0)--
80R_CUDA_8_320x1D365814(0, 8, 26, 32)--
114R_CUDA_ABS56_16_340x1D367DD2(16, 8, 9, 2)slot1=(34, 48, 21, 10) -- 8 + 48 = 56 bits
116R_CUDA_NONE_LAST0xFF0xFF00(0, 0xFF0000, 0, 0xFF000000)slot1=(0, 0, 255, 0); slot2=(0xFF00, 0, 0xFF0000, 0); sentinel=0xFF000000

bit_offset and bit_width recovered from the descriptors agree byte-for-byte with the values parsed from the type-name suffixes in the standard table above for every entry where the suffix is unambiguous. Where the name encodes a single bit-width (e.g. R_CUDA_ABS55_16_34), the descriptor splits it across two slots whose widths sum to the advertised value.

QUIRK -- diagonal-0xFF terminator on R_CUDA_NONE_LAST The final standard-table entry (idx 116) is not a real descriptor. Its 64 bytes form an 8×8 grid with 0xFF on the diagonal and zeros elsewhere, so the name pointer reads as 0x00000000_000000FF, the apply-class as 0xFF00, and the sentinel slot at byte 60 contains 0xFF000000 -- every parse axis returns garbage. The bounds check at sub_42F6C0 line 23 (a1 >= 0x75) already prevents real dispatch on index 116, so the diagonal pattern functions as a poison page: if anything ever reaches descriptor 116, any field you read will be obviously corrupt. Treat it as a tripwire, not a relocation type.

QUIRK -- aux overload for HI-half addend versus byte offset The 4-byte aux field at byte 24 (slot0) means different things depending on action. For action 7 (*_HI_* family) it carries the value 0x20 (32 = "shift right by 32 to extract the high half before insertion"). For actions 22..29 / 30..37 / 38..45 / 47..54 (the eight-way 8-bit patch families) it carries the byte offset within the target word -- 0, 8, 16, ... 56 -- exactly mirroring the type-name suffix. The same dword slot therefore encodes either a shift-count constant or a byte-offset constant, with the action enum being the sole disambiguator. Pre-decoding code that treats aux as a single semantic field will misread one family or the other.

QUIRK -- attribute table reuses payload format unchanged The 65 attribute descriptors at off_1D3CBE0 are not a separate format -- they share the exact same 64-byte layout and the same apply_class / action / slot semantics as the standard table. The attribute bit (r_type & 0x10000) only selects which table the engine indexes (sub_469620 lines 31--38; sub_42F6C0 line 14: a1 -= 0x10000). String pointers in attribute-table records point into the same .rodata string pool used by the standard table, which is why the two tables share names by pointer equality. No attribute-specific action codes exist; the only difference is the consumer -- the .nv.info.* parser for attribute relocations versus the instruction-stream patcher for standard ones.

Field cross-check against consumer code

  • sub_469620 line 43: v5 = HIDWORD(v3[8 * idx + 2]) reads QWORD index 8*idx + 2 from off_1D3DBE0 cast to _QWORD *. That is byte offset 64*idx + 16; HIDWORD of that QWORD is bytes 20..23 = slot0.action. Bit-tested against 0x3FFFE002C6.

  • sub_4698A0 line 37: *((_DWORD *)&off_1D3DBE0 + 16 * idx + 5) -- with 4-byte DWORD stride, that is byte offset 64*idx + 20 = slot0.action. The check action - 12 <= 3 selects actions 12, 13, 14, 15 -- exactly the R_CUDA_FUNC_DESC32_* family.

  • sub_469D60 line 309: *((_DWORD *)v24 + 5) == 16 checks slot0.action == 16, i.e. R_CUDA_PCREL_IMM24_* -- gating the PC-relative branch-offset path.

  • sub_468760 (the application engine): iterates the three 16-byte slots from desc+12 to desc+60 using action += 4 (four DWORDs = 16 bytes per slot), confirming the 16-byte stride between slots and the 4-byte sentinel terminator at byte 60.

  • Relocation Application Engine -- bit-field patching engine that consumes these descriptors

  • Bindless Relocations -- resolution pipeline for bindless texture/surface types

  • R_MERCURY Relocation Catalog -- parallel catalog for Mercury (sm >= 100) types

  • Binary Layout -- addresses of descriptor tables within the nvlink binary

Confidence Assessment

Verification scope: All 117 standard-table names and 65 attribute-table indices were cross-checked against nvlink_strings.json (exact-string match) and the decompiled table dispatcher sub_42F6C0 (nvlink/decompiled/sub_42F6C0_0x42f6c0.c). Ten entries were spot-checked end-to-end: string presence, string address, and relocation-engine consumption of off_1D3DBE0.

Totals: 117 standard entries + 65 attribute entries = 182 catalog rows. String verification: 119 / 119 raw strings in nvlink_strings.json (includes two trailing-whitespace duplicates of R_CUDA_UNIFIED_8_0 and R_CUDA_UNIFIED_8_8 at 0x1d3cb9f / 0x1d3cbb3) collapse to the 117 canonical names after trimming. Verified: 117 / 117 canonical names. Unverified: 0.

Spot-check table (10 entries)

EntryConfidenceEvidence
R_CUDA_NONE (idx 0)HIGHString at 0x1D35F60 (nvlink_strings.json); dispatched via off_1D37600[0] in sub_42F6C0 (line 25); sentinel no-op path in relocation engine
R_CUDA_G64 (idx 4)HIGHString at 0x1D35F8B; reachable via off_1D37600[4] in sub_42F6C0; descriptor consumed by sub_469620 (line 27: v8 = &off_1D3DBE0)
R_CUDA_TEX_HEADER_INDEX (idx 6)HIGHString at 0x1D35FA6; texture-binding path in bindless relocation engine
R_CUDA_CONST_FIELD19_28 (idx 24)HIGHString at 0x1D36108; 19-bit bitfield encoding at position 28 matches the name suffix
R_CUDA_FUNC_DESC_32 (idx 34)HIGHString at 0x1D361E4; descriptor table entry consumed by sub_46ADC0 (line 135: v90 = &off_1D3DBE0) -- resolved relocations emitter
R_CUDA_PCREL_IMM24_26 (idx 40)HIGHString at 0x1D3626B; PC-relative branch handler in relocation engine
R_CUDA_INSTRUCTION64 (idx 53)HIGHString at 0x1D3637E; whole-instruction replacement path in sub_469D60 (line 214: v152 = &off_1D3DBE0)
R_CUDA_BINDLESSOFF14_40 (idx 65)HIGHString at 0x1D36471; bindless-offset handler in texture relocation pipeline
R_CUDA_YIELD_OPCODE9_0 (idx 68)HIGHString at 0x1D364B7; YIELD-opcode rewrite path in sub_469D60; cross-referenced in ptxas wiki (relocations.md line 244)
R_CUDA_NONE_LAST (idx 116)HIGHString at 0x1D36808; end-of-range sentinel -- bounds a1 >= 0x75 check in sub_42F6C0 (line 26)

Cross-reference with the ptxas Relocations page: The ten spot-checked names match verbatim against ptxas lines 80, 124, 140, 155, 179, 195, 217, 242, 244, 248. No ordinal drift between ptxas and nvlink for these entries.

AspectConfidenceBasis
Type names (all 117 entries)HIGH117/117 canonical names found in nvlink_strings.json at addresses 0x1D35F60--0x1D36808 (contiguous string-pool region); no missing entries
Standard table address (off_1D37600)HIGHConfirmed in decompiled sub_42F6C0 line 25 (v7 = &off_1D37600); bounds check a1 >= 0x75 (117 = 0x75) at line 26
Attribute table address (off_1D371E0)HIGHConfirmed in decompiled sub_42F6C0 line 17 (v7 = &off_1D371E0); bounds check a1 < 0x41 (65 = 0x41) at line 18 after a1 -= 0x10000
Descriptor table address (off_1D3DBE0)HIGHReferenced by three relocation engines: sub_469620 (line 27), sub_46ADC0 (line 135), sub_469D60 (line 214)
Entry count (117 standard, 65 attribute)HIGHTable bounds encoded as immediate constants in sub_42F6C0: v6 = 117 (line 24) and v6 = 65 (line 16)
Index-to-name mappingHIGHName strings are stored as 16-byte records (ptr, 3xDWORD metadata) at off_1D37600; sub_42F6C0 line 29: v8 = &v7[2 * a1] confirms 16-byte stride
Bit width / bit position columnsHIGHByte-decoded from the width (offset 16) and shift (offset 12) dwords inside the 64-byte descriptors at off_1D3DBE0. Values match the type-name suffix convention for every entry where the suffix is unambiguous (see Descriptor Byte Layout section).
Category classificationMEDIUMInferred from naming patterns (ABS = absolute, PCREL = PC-relative, CONST_FIELD = constant bank, FUNC_DESC = function descriptor, etc.); no explicit category field in the binary
Attribute table shared-name mappingMEDIUMAttribute entries at off_1D371E0 share string pointers with the standard table at off_1D37600 by pointer equality; the 1:1 index mapping is inferred from array position, not from an explicit mapping table. Gaps in the attribute table (e.g. indices beyond 0x40) fall through to the "unknown attribute" diagnostic at sub_42F6C0 line 21
Action-code bit-field interpretationHIGHThe 64-byte descriptor layout (name_ptr, kind, shift, width, action, extra[10]) was byte-decoded for all 117 entries from nvlink_rodata.bin at rodata offset 0xBA40. The action dword position (bytes 20..23) is confirmed by three independent consumer accesses: sub_4698A0 line 37 (...+ 16*idx + 5 DWORD = byte 20), sub_469620 line 43 (HIDWORD(v3[8*idx+2]) = byte 20), and sub_469D60 line 309 (*((_DWORD *)v24 + 5) == 16 gating the PC-rel path).
Descriptor kind field (byte 8 dword)HIGHDistribution across the 117 entries is fully accounted for: kind=0 (sentinel, 1), kind=1 (instr bit-fields, 39), kind=2 (descriptors/globals/instr-replace, 52), kind=4 (data/byte, 24), kind=0xFF00 (poison sentinel, 1).
Split-field extra[] continuationsMEDIUMThe piece-count + (shift_n, width_n, ...) interpretation matches every observed entry: R_CUDA_ABS55_16_34 (8 + 47 = 55), R_CUDA_CONST_FIELD19_28 (14 + 4 + 1 = 19), R_CUDA_ABS56_16_34 (8 + 48 = 56). The exact role of the per-piece trailing dwords (values 10, 11, 21) is not yet decoded but they appear constant across same-class entries.
Attribute table shared 64-byte formatHIGHsub_469620 lines 26--38 select between off_1D3DBE0 and off_1D3CBE0 purely by the r_type & 0x10000 bit. The attribute table follows the same 64-byte stride and the same field-by-field layout.