libcuda.so.init.c 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593
  1. /*
  2. * Copyright 2018-2020 Yury Gribov
  3. *
  4. * The MIT License (MIT)
  5. *
  6. * Use of this source code is governed by MIT license that can be
  7. * found in the LICENSE.txt file.
  8. */
  9. #include <dlfcn.h>
  10. #include <stdlib.h>
  11. #include <stdio.h>
  12. #include <assert.h>
  13. // Sanity check for ARM to avoid puzzling runtime crashes
  14. #ifdef __arm__
  15. # if defined __thumb__ && ! defined __THUMB_INTERWORK__
  16. # error "ARM trampolines need -mthumb-interwork to work in Thumb mode"
  17. # endif
  18. #endif
  19. #ifdef __cplusplus
  20. extern "C" {
  21. #endif
  22. #define CHECK(cond, fmt, ...) do { \
  23. if(!(cond)) { \
  24. fprintf(stderr, "implib-gen: libcuda.so.1: " fmt "\n", ##__VA_ARGS__); \
  25. assert(0 && "Assertion in generated code"); \
  26. exit(1); \
  27. } \
  28. } while(0)
  29. #define CALL_USER_CALLBACK 0
  30. #define NO_DLOPEN False
  31. #define LAZY_LOAD 1
  32. static void *lib_handle;
  33. static int is_lib_loading;
  34. static void *load_library() {
  35. if(lib_handle)
  36. return lib_handle;
  37. is_lib_loading = 1;
  38. // TODO: dlopen and users callback must be protected w/ critical section (to avoid dlopening lib twice)
  39. #if NO_DLOPEN
  40. CHECK(0, "internal error"); // We shouldn't get here
  41. #elif CALL_USER_CALLBACK
  42. extern void *(const char *lib_name);
  43. lib_handle = ("libcuda.so.1");
  44. CHECK(lib_handle, "callback '' failed to load library");
  45. #else
  46. lib_handle = dlopen("libcuda.so.1", RTLD_LAZY | RTLD_GLOBAL);
  47. CHECK(lib_handle, "failed to load library: %s", dlerror());
  48. #endif
  49. is_lib_loading = 0;
  50. return lib_handle;
  51. }
  52. #if ! NO_DLOPEN && ! LAZY_LOAD
  53. static void __attribute__((constructor)) load_lib() {
  54. load_library();
  55. }
  56. #endif
  57. static void __attribute__((destructor)) unload_lib() {
  58. if(lib_handle)
  59. dlclose(lib_handle);
  60. }
  61. // TODO: convert to single 0-separated string
  62. static const char *const sym_names[] = {
  63. "cuArray3DCreate",
  64. "cuArray3DCreate_v2",
  65. "cuArray3DGetDescriptor",
  66. "cuArray3DGetDescriptor_v2",
  67. "cuArrayCreate",
  68. "cuArrayCreate_v2",
  69. "cuArrayDestroy",
  70. "cuArrayGetDescriptor",
  71. "cuArrayGetDescriptor_v2",
  72. "cuArrayGetSparseProperties",
  73. "cuCtxAttach",
  74. "cuCtxCreate",
  75. "cuCtxCreate_v2",
  76. "cuCtxDestroy",
  77. "cuCtxDestroy_v2",
  78. "cuCtxDetach",
  79. "cuCtxDisablePeerAccess",
  80. "cuCtxEnablePeerAccess",
  81. "cuCtxGetApiVersion",
  82. "cuCtxGetCacheConfig",
  83. "cuCtxGetCurrent",
  84. "cuCtxGetDevice",
  85. "cuCtxGetFlags",
  86. "cuCtxGetLimit",
  87. "cuCtxGetSharedMemConfig",
  88. "cuCtxGetStreamPriorityRange",
  89. "cuCtxPopCurrent",
  90. "cuCtxPopCurrent_v2",
  91. "cuCtxPushCurrent",
  92. "cuCtxPushCurrent_v2",
  93. "cuCtxResetPersistingL2Cache",
  94. "cuCtxSetCacheConfig",
  95. "cuCtxSetCurrent",
  96. "cuCtxSetLimit",
  97. "cuCtxSetSharedMemConfig",
  98. "cuCtxSynchronize",
  99. "cuDestroyExternalMemory",
  100. "cuDestroyExternalSemaphore",
  101. "cuDeviceCanAccessPeer",
  102. "cuDeviceComputeCapability",
  103. "cuDeviceGet",
  104. "cuDeviceGetAttribute",
  105. "cuDeviceGetByPCIBusId",
  106. "cuDeviceGetCount",
  107. "cuDeviceGetLuid",
  108. "cuDeviceGetName",
  109. "cuDeviceGetNvSciSyncAttributes",
  110. "cuDeviceGetP2PAttribute",
  111. "cuDeviceGetPCIBusId",
  112. "cuDeviceGetProperties",
  113. "cuDeviceGetTexture1DLinearMaxWidth",
  114. "cuDeviceGetUuid",
  115. "cuDevicePrimaryCtxGetState",
  116. "cuDevicePrimaryCtxRelease",
  117. "cuDevicePrimaryCtxRelease_v2",
  118. "cuDevicePrimaryCtxReset",
  119. "cuDevicePrimaryCtxReset_v2",
  120. "cuDevicePrimaryCtxRetain",
  121. "cuDevicePrimaryCtxSetFlags",
  122. "cuDevicePrimaryCtxSetFlags_v2",
  123. "cuDeviceTotalMem",
  124. "cuDeviceTotalMem_v2",
  125. "cuDriverGetVersion",
  126. "cuEGLApiInit",
  127. "cuEGLStreamConsumerAcquireFrame",
  128. "cuEGLStreamConsumerConnect",
  129. "cuEGLStreamConsumerConnectWithFlags",
  130. "cuEGLStreamConsumerDisconnect",
  131. "cuEGLStreamConsumerReleaseFrame",
  132. "cuEGLStreamProducerConnect",
  133. "cuEGLStreamProducerDisconnect",
  134. "cuEGLStreamProducerPresentFrame",
  135. "cuEGLStreamProducerReturnFrame",
  136. "cuEventCreate",
  137. "cuEventDestroy",
  138. "cuEventDestroy_v2",
  139. "cuEventElapsedTime",
  140. "cuEventQuery",
  141. "cuEventRecord",
  142. "cuEventRecordWithFlags",
  143. "cuEventRecordWithFlags_ptsz",
  144. "cuEventRecord_ptsz",
  145. "cuEventSynchronize",
  146. "cuExternalMemoryGetMappedBuffer",
  147. "cuExternalMemoryGetMappedMipmappedArray",
  148. "cuFuncGetAttribute",
  149. "cuFuncGetModule",
  150. "cuFuncSetAttribute",
  151. "cuFuncSetBlockShape",
  152. "cuFuncSetCacheConfig",
  153. "cuFuncSetSharedMemConfig",
  154. "cuFuncSetSharedSize",
  155. "cuGLCtxCreate",
  156. "cuGLCtxCreate_v2",
  157. "cuGLGetDevices",
  158. "cuGLGetDevices_v2",
  159. "cuGLInit",
  160. "cuGLMapBufferObject",
  161. "cuGLMapBufferObjectAsync",
  162. "cuGLMapBufferObjectAsync_v2",
  163. "cuGLMapBufferObjectAsync_v2_ptsz",
  164. "cuGLMapBufferObject_v2",
  165. "cuGLMapBufferObject_v2_ptds",
  166. "cuGLRegisterBufferObject",
  167. "cuGLSetBufferObjectMapFlags",
  168. "cuGLUnmapBufferObject",
  169. "cuGLUnmapBufferObjectAsync",
  170. "cuGLUnregisterBufferObject",
  171. "cuGetErrorName",
  172. "cuGetErrorString",
  173. "cuGetExportTable",
  174. "cuGraphAddChildGraphNode",
  175. "cuGraphAddDependencies",
  176. "cuGraphAddEmptyNode",
  177. "cuGraphAddEventRecordNode",
  178. "cuGraphAddEventWaitNode",
  179. "cuGraphAddHostNode",
  180. "cuGraphAddKernelNode",
  181. "cuGraphAddMemcpyNode",
  182. "cuGraphAddMemsetNode",
  183. "cuGraphChildGraphNodeGetGraph",
  184. "cuGraphClone",
  185. "cuGraphCreate",
  186. "cuGraphDestroy",
  187. "cuGraphDestroyNode",
  188. "cuGraphEventRecordNodeGetEvent",
  189. "cuGraphEventRecordNodeSetEvent",
  190. "cuGraphEventWaitNodeGetEvent",
  191. "cuGraphEventWaitNodeSetEvent",
  192. "cuGraphExecChildGraphNodeSetParams",
  193. "cuGraphExecDestroy",
  194. "cuGraphExecEventRecordNodeSetEvent",
  195. "cuGraphExecEventWaitNodeSetEvent",
  196. "cuGraphExecHostNodeSetParams",
  197. "cuGraphExecKernelNodeSetParams",
  198. "cuGraphExecMemcpyNodeSetParams",
  199. "cuGraphExecMemsetNodeSetParams",
  200. "cuGraphExecUpdate",
  201. "cuGraphGetEdges",
  202. "cuGraphGetNodes",
  203. "cuGraphGetRootNodes",
  204. "cuGraphHostNodeGetParams",
  205. "cuGraphHostNodeSetParams",
  206. "cuGraphInstantiate",
  207. "cuGraphInstantiate_v2",
  208. "cuGraphKernelNodeCopyAttributes",
  209. "cuGraphKernelNodeGetAttribute",
  210. "cuGraphKernelNodeGetParams",
  211. "cuGraphKernelNodeSetAttribute",
  212. "cuGraphKernelNodeSetParams",
  213. "cuGraphLaunch",
  214. "cuGraphLaunch_ptsz",
  215. "cuGraphMemcpyNodeGetParams",
  216. "cuGraphMemcpyNodeSetParams",
  217. "cuGraphMemsetNodeGetParams",
  218. "cuGraphMemsetNodeSetParams",
  219. "cuGraphNodeFindInClone",
  220. "cuGraphNodeGetDependencies",
  221. "cuGraphNodeGetDependentNodes",
  222. "cuGraphNodeGetType",
  223. "cuGraphRemoveDependencies",
  224. "cuGraphUpload",
  225. "cuGraphUpload_ptsz",
  226. "cuGraphicsEGLRegisterImage",
  227. "cuGraphicsGLRegisterBuffer",
  228. "cuGraphicsGLRegisterImage",
  229. "cuGraphicsMapResources",
  230. "cuGraphicsMapResources_ptsz",
  231. "cuGraphicsResourceGetMappedEglFrame",
  232. "cuGraphicsResourceGetMappedMipmappedArray",
  233. "cuGraphicsResourceGetMappedPointer",
  234. "cuGraphicsResourceGetMappedPointer_v2",
  235. "cuGraphicsResourceSetMapFlags",
  236. "cuGraphicsResourceSetMapFlags_v2",
  237. "cuGraphicsSubResourceGetMappedArray",
  238. "cuGraphicsUnmapResources",
  239. "cuGraphicsUnmapResources_ptsz",
  240. "cuGraphicsUnregisterResource",
  241. "cuGraphicsVDPAURegisterOutputSurface",
  242. "cuGraphicsVDPAURegisterVideoSurface",
  243. "cuImportExternalMemory",
  244. "cuImportExternalSemaphore",
  245. "cuInit",
  246. "cuIpcCloseMemHandle",
  247. "cuIpcGetEventHandle",
  248. "cuIpcGetMemHandle",
  249. "cuIpcOpenEventHandle",
  250. "cuIpcOpenMemHandle",
  251. "cuIpcOpenMemHandle_v2",
  252. "cuLaunch",
  253. "cuLaunchCooperativeKernel",
  254. "cuLaunchCooperativeKernelMultiDevice",
  255. "cuLaunchCooperativeKernel_ptsz",
  256. "cuLaunchGrid",
  257. "cuLaunchGridAsync",
  258. "cuLaunchHostFunc",
  259. "cuLaunchHostFunc_ptsz",
  260. "cuLaunchKernel",
  261. "cuLaunchKernel_ptsz",
  262. "cuLinkAddData",
  263. "cuLinkAddData_v2",
  264. "cuLinkAddFile",
  265. "cuLinkAddFile_v2",
  266. "cuLinkComplete",
  267. "cuLinkCreate",
  268. "cuLinkCreate_v2",
  269. "cuLinkDestroy",
  270. "cuMemAddressFree",
  271. "cuMemAddressReserve",
  272. "cuMemAdvise",
  273. "cuMemAlloc",
  274. "cuMemAllocHost",
  275. "cuMemAllocHost_v2",
  276. "cuMemAllocManaged",
  277. "cuMemAllocPitch",
  278. "cuMemAllocPitch_v2",
  279. "cuMemAlloc_v2",
  280. "cuMemCreate",
  281. "cuMemExportToShareableHandle",
  282. "cuMemFree",
  283. "cuMemFreeHost",
  284. "cuMemFree_v2",
  285. "cuMemGetAccess",
  286. "cuMemGetAddressRange",
  287. "cuMemGetAddressRange_v2",
  288. "cuMemGetAllocationGranularity",
  289. "cuMemGetAllocationPropertiesFromHandle",
  290. "cuMemGetAttribute",
  291. "cuMemGetAttribute_v2",
  292. "cuMemGetInfo",
  293. "cuMemGetInfo_v2",
  294. "cuMemHostAlloc",
  295. "cuMemHostGetDevicePointer",
  296. "cuMemHostGetDevicePointer_v2",
  297. "cuMemHostGetFlags",
  298. "cuMemHostRegister",
  299. "cuMemHostRegister_v2",
  300. "cuMemHostUnregister",
  301. "cuMemImportFromShareableHandle",
  302. "cuMemMap",
  303. "cuMemMapArrayAsync",
  304. "cuMemMapArrayAsync_ptsz",
  305. "cuMemPrefetchAsync",
  306. "cuMemPrefetchAsync_ptsz",
  307. "cuMemRangeGetAttribute",
  308. "cuMemRangeGetAttributes",
  309. "cuMemRelease",
  310. "cuMemRetainAllocationHandle",
  311. "cuMemSetAccess",
  312. "cuMemUnmap",
  313. "cuMemcpy",
  314. "cuMemcpy2D",
  315. "cuMemcpy2DAsync",
  316. "cuMemcpy2DAsync_v2",
  317. "cuMemcpy2DAsync_v2_ptsz",
  318. "cuMemcpy2DUnaligned",
  319. "cuMemcpy2DUnaligned_v2",
  320. "cuMemcpy2DUnaligned_v2_ptds",
  321. "cuMemcpy2D_v2",
  322. "cuMemcpy2D_v2_ptds",
  323. "cuMemcpy3D",
  324. "cuMemcpy3DAsync",
  325. "cuMemcpy3DAsync_v2",
  326. "cuMemcpy3DAsync_v2_ptsz",
  327. "cuMemcpy3DPeer",
  328. "cuMemcpy3DPeerAsync",
  329. "cuMemcpy3DPeerAsync_ptsz",
  330. "cuMemcpy3DPeer_ptds",
  331. "cuMemcpy3D_v2",
  332. "cuMemcpy3D_v2_ptds",
  333. "cuMemcpyAsync",
  334. "cuMemcpyAsync_ptsz",
  335. "cuMemcpyAtoA",
  336. "cuMemcpyAtoA_v2",
  337. "cuMemcpyAtoA_v2_ptds",
  338. "cuMemcpyAtoD",
  339. "cuMemcpyAtoD_v2",
  340. "cuMemcpyAtoD_v2_ptds",
  341. "cuMemcpyAtoH",
  342. "cuMemcpyAtoHAsync",
  343. "cuMemcpyAtoHAsync_v2",
  344. "cuMemcpyAtoHAsync_v2_ptsz",
  345. "cuMemcpyAtoH_v2",
  346. "cuMemcpyAtoH_v2_ptds",
  347. "cuMemcpyDtoA",
  348. "cuMemcpyDtoA_v2",
  349. "cuMemcpyDtoA_v2_ptds",
  350. "cuMemcpyDtoD",
  351. "cuMemcpyDtoDAsync",
  352. "cuMemcpyDtoDAsync_v2",
  353. "cuMemcpyDtoDAsync_v2_ptsz",
  354. "cuMemcpyDtoD_v2",
  355. "cuMemcpyDtoD_v2_ptds",
  356. "cuMemcpyDtoH",
  357. "cuMemcpyDtoHAsync",
  358. "cuMemcpyDtoHAsync_v2",
  359. "cuMemcpyDtoHAsync_v2_ptsz",
  360. "cuMemcpyDtoH_v2",
  361. "cuMemcpyDtoH_v2_ptds",
  362. "cuMemcpyHtoA",
  363. "cuMemcpyHtoAAsync",
  364. "cuMemcpyHtoAAsync_v2",
  365. "cuMemcpyHtoAAsync_v2_ptsz",
  366. "cuMemcpyHtoA_v2",
  367. "cuMemcpyHtoA_v2_ptds",
  368. "cuMemcpyHtoD",
  369. "cuMemcpyHtoDAsync",
  370. "cuMemcpyHtoDAsync_v2",
  371. "cuMemcpyHtoDAsync_v2_ptsz",
  372. "cuMemcpyHtoD_v2",
  373. "cuMemcpyHtoD_v2_ptds",
  374. "cuMemcpyPeer",
  375. "cuMemcpyPeerAsync",
  376. "cuMemcpyPeerAsync_ptsz",
  377. "cuMemcpyPeer_ptds",
  378. "cuMemcpy_ptds",
  379. "cuMemsetD16",
  380. "cuMemsetD16Async",
  381. "cuMemsetD16Async_ptsz",
  382. "cuMemsetD16_v2",
  383. "cuMemsetD16_v2_ptds",
  384. "cuMemsetD2D16",
  385. "cuMemsetD2D16Async",
  386. "cuMemsetD2D16Async_ptsz",
  387. "cuMemsetD2D16_v2",
  388. "cuMemsetD2D16_v2_ptds",
  389. "cuMemsetD2D32",
  390. "cuMemsetD2D32Async",
  391. "cuMemsetD2D32Async_ptsz",
  392. "cuMemsetD2D32_v2",
  393. "cuMemsetD2D32_v2_ptds",
  394. "cuMemsetD2D8",
  395. "cuMemsetD2D8Async",
  396. "cuMemsetD2D8Async_ptsz",
  397. "cuMemsetD2D8_v2",
  398. "cuMemsetD2D8_v2_ptds",
  399. "cuMemsetD32",
  400. "cuMemsetD32Async",
  401. "cuMemsetD32Async_ptsz",
  402. "cuMemsetD32_v2",
  403. "cuMemsetD32_v2_ptds",
  404. "cuMemsetD8",
  405. "cuMemsetD8Async",
  406. "cuMemsetD8Async_ptsz",
  407. "cuMemsetD8_v2",
  408. "cuMemsetD8_v2_ptds",
  409. "cuMipmappedArrayCreate",
  410. "cuMipmappedArrayDestroy",
  411. "cuMipmappedArrayGetLevel",
  412. "cuMipmappedArrayGetSparseProperties",
  413. "cuModuleGetFunction",
  414. "cuModuleGetGlobal",
  415. "cuModuleGetGlobal_v2",
  416. "cuModuleGetSurfRef",
  417. "cuModuleGetTexRef",
  418. "cuModuleLoad",
  419. "cuModuleLoadData",
  420. "cuModuleLoadDataEx",
  421. "cuModuleLoadFatBinary",
  422. "cuModuleUnload",
  423. "cuOccupancyAvailableDynamicSMemPerBlock",
  424. "cuOccupancyMaxActiveBlocksPerMultiprocessor",
  425. "cuOccupancyMaxActiveBlocksPerMultiprocessorWithFlags",
  426. "cuOccupancyMaxPotentialBlockSize",
  427. "cuOccupancyMaxPotentialBlockSizeWithFlags",
  428. "cuParamSetSize",
  429. "cuParamSetTexRef",
  430. "cuParamSetf",
  431. "cuParamSeti",
  432. "cuParamSetv",
  433. "cuPointerGetAttribute",
  434. "cuPointerGetAttributes",
  435. "cuPointerSetAttribute",
  436. "cuProfilerInitialize",
  437. "cuProfilerStart",
  438. "cuProfilerStop",
  439. "cuSignalExternalSemaphoresAsync",
  440. "cuSignalExternalSemaphoresAsync_ptsz",
  441. "cuStreamAddCallback",
  442. "cuStreamAddCallback_ptsz",
  443. "cuStreamAttachMemAsync",
  444. "cuStreamAttachMemAsync_ptsz",
  445. "cuStreamBatchMemOp",
  446. "cuStreamBatchMemOp_ptsz",
  447. "cuStreamBeginCapture",
  448. "cuStreamBeginCapture_ptsz",
  449. "cuStreamBeginCapture_v2",
  450. "cuStreamBeginCapture_v2_ptsz",
  451. "cuStreamCopyAttributes",
  452. "cuStreamCopyAttributes_ptsz",
  453. "cuStreamCreate",
  454. "cuStreamCreateWithPriority",
  455. "cuStreamDestroy",
  456. "cuStreamDestroy_v2",
  457. "cuStreamEndCapture",
  458. "cuStreamEndCapture_ptsz",
  459. "cuStreamGetAttribute",
  460. "cuStreamGetAttribute_ptsz",
  461. "cuStreamGetCaptureInfo",
  462. "cuStreamGetCaptureInfo_ptsz",
  463. "cuStreamGetCtx",
  464. "cuStreamGetCtx_ptsz",
  465. "cuStreamGetFlags",
  466. "cuStreamGetFlags_ptsz",
  467. "cuStreamGetPriority",
  468. "cuStreamGetPriority_ptsz",
  469. "cuStreamIsCapturing",
  470. "cuStreamIsCapturing_ptsz",
  471. "cuStreamQuery",
  472. "cuStreamQuery_ptsz",
  473. "cuStreamSetAttribute",
  474. "cuStreamSetAttribute_ptsz",
  475. "cuStreamSynchronize",
  476. "cuStreamSynchronize_ptsz",
  477. "cuStreamWaitEvent",
  478. "cuStreamWaitEvent_ptsz",
  479. "cuStreamWaitValue32",
  480. "cuStreamWaitValue32_ptsz",
  481. "cuStreamWaitValue64",
  482. "cuStreamWaitValue64_ptsz",
  483. "cuStreamWriteValue32",
  484. "cuStreamWriteValue32_ptsz",
  485. "cuStreamWriteValue64",
  486. "cuStreamWriteValue64_ptsz",
  487. "cuSurfObjectCreate",
  488. "cuSurfObjectDestroy",
  489. "cuSurfObjectGetResourceDesc",
  490. "cuSurfRefGetArray",
  491. "cuSurfRefSetArray",
  492. "cuTexObjectCreate",
  493. "cuTexObjectDestroy",
  494. "cuTexObjectGetResourceDesc",
  495. "cuTexObjectGetResourceViewDesc",
  496. "cuTexObjectGetTextureDesc",
  497. "cuTexRefCreate",
  498. "cuTexRefDestroy",
  499. "cuTexRefGetAddress",
  500. "cuTexRefGetAddressMode",
  501. "cuTexRefGetAddress_v2",
  502. "cuTexRefGetArray",
  503. "cuTexRefGetBorderColor",
  504. "cuTexRefGetFilterMode",
  505. "cuTexRefGetFlags",
  506. "cuTexRefGetFormat",
  507. "cuTexRefGetMaxAnisotropy",
  508. "cuTexRefGetMipmapFilterMode",
  509. "cuTexRefGetMipmapLevelBias",
  510. "cuTexRefGetMipmapLevelClamp",
  511. "cuTexRefGetMipmappedArray",
  512. "cuTexRefSetAddress",
  513. "cuTexRefSetAddress2D",
  514. "cuTexRefSetAddress2D_v2",
  515. "cuTexRefSetAddress2D_v3",
  516. "cuTexRefSetAddressMode",
  517. "cuTexRefSetAddress_v2",
  518. "cuTexRefSetArray",
  519. "cuTexRefSetBorderColor",
  520. "cuTexRefSetFilterMode",
  521. "cuTexRefSetFlags",
  522. "cuTexRefSetFormat",
  523. "cuTexRefSetMaxAnisotropy",
  524. "cuTexRefSetMipmapFilterMode",
  525. "cuTexRefSetMipmapLevelBias",
  526. "cuTexRefSetMipmapLevelClamp",
  527. "cuTexRefSetMipmappedArray",
  528. "cuThreadExchangeStreamCaptureMode",
  529. "cuVDPAUCtxCreate",
  530. "cuVDPAUCtxCreate_v2",
  531. "cuVDPAUGetDevice",
  532. "cuWaitExternalSemaphoresAsync",
  533. "cuWaitExternalSemaphoresAsync_ptsz",
  534. "cudbgApiAttach",
  535. "cudbgApiDetach",
  536. "cudbgApiInit",
  537. "cudbgGetAPI",
  538. "cudbgGetAPIVersion",
  539. "cudbgMain",
  540. "cudbgReportDriverApiError",
  541. "cudbgReportDriverInternalError",
  542. 0
  543. };
  544. extern void *_libcuda_so_tramp_table[];
  545. // Can be sped up by manually parsing library symtab...
  546. void _libcuda_so_tramp_resolve(int i) {
  547. assert((unsigned)i + 1 < sizeof(sym_names) / sizeof(sym_names[0]));
  548. CHECK(!is_lib_loading, "library function '%s' called during library load", sym_names[i]);
  549. void *h = 0;
  550. #if NO_DLOPEN
  551. // FIXME: instead of RTLD_NEXT we should search for loaded lib_handle
  552. // as in https://github.com/jethrogb/ssltrace/blob/bf17c150a7/ssltrace.cpp#L74-L112
  553. h = RTLD_NEXT;
  554. #elif LAZY_LOAD
  555. h = load_library();
  556. #else
  557. h = lib_handle;
  558. CHECK(h, "failed to resolve symbol '%s', library failed to load", sym_names[i]);
  559. #endif
  560. // Dlsym is thread-safe so don't need to protect it.
  561. _libcuda_so_tramp_table[i] = dlsym(h, sym_names[i]);
  562. CHECK(_libcuda_so_tramp_table[i], "failed to resolve symbol '%s'", sym_names[i]);
  563. }
  564. // Helper for user to resolve all symbols
  565. void _libcuda_so_tramp_resolve_all(void) {
  566. size_t i;
  567. for(i = 0; i + 1 < sizeof(sym_names) / sizeof(sym_names[0]); ++i)
  568. _libcuda_so_tramp_resolve(i);
  569. }
  570. #ifdef __cplusplus
  571. } // extern "C"
  572. #endif