frida 16.2.1 → 16.2.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (386) hide show
  1. package/BSDmakefile +6 -0
  2. package/Makefile +16 -0
  3. package/README.md +14 -11
  4. package/configure +18 -0
  5. package/configure.bat +22 -0
  6. package/dist/native.js +0 -8
  7. package/lib/application.ts +98 -0
  8. package/lib/authentication.ts +3 -0
  9. package/lib/build.py +50 -0
  10. package/lib/bus.ts +30 -0
  11. package/lib/cancellable.ts +33 -0
  12. package/lib/child.ts +15 -0
  13. package/lib/crash.ts +11 -0
  14. package/lib/device.ts +329 -0
  15. package/lib/device_manager.ts +69 -0
  16. package/lib/endpoint_parameters.ts +56 -0
  17. package/lib/icon.ts +15 -0
  18. package/lib/index.ts +311 -0
  19. package/lib/iostream.ts +78 -0
  20. package/lib/meson.build +53 -0
  21. package/lib/native.ts +9 -0
  22. package/lib/portal_membership.ts +10 -0
  23. package/lib/portal_service.ts +105 -0
  24. package/lib/process.ts +57 -0
  25. package/lib/relay.ts +44 -0
  26. package/lib/script.ts +352 -0
  27. package/lib/session.ts +113 -0
  28. package/lib/signals.ts +45 -0
  29. package/lib/socket_address.ts +35 -0
  30. package/lib/spawn.ts +4 -0
  31. package/lib/system_parameters.ts +78 -0
  32. package/make.bat +23 -0
  33. package/meson.build +160 -0
  34. package/meson.options +11 -0
  35. package/package.json +27 -6
  36. package/releng/deps.py +1133 -0
  37. package/releng/deps.toml +391 -0
  38. package/releng/devkit-assets/frida-core-example-unix.c +188 -0
  39. package/releng/devkit-assets/frida-core-example-windows.c +197 -0
  40. package/releng/devkit-assets/frida-core-example.sln +28 -0
  41. package/releng/devkit-assets/frida-core-example.vcxproj +157 -0
  42. package/releng/devkit-assets/frida-core-example.vcxproj.filters +27 -0
  43. package/releng/devkit-assets/frida-gum-example-unix.c +122 -0
  44. package/releng/devkit-assets/frida-gum-example-windows.c +132 -0
  45. package/releng/devkit-assets/frida-gum-example.sln +28 -0
  46. package/releng/devkit-assets/frida-gum-example.vcxproj +157 -0
  47. package/releng/devkit-assets/frida-gum-example.vcxproj.filters +27 -0
  48. package/releng/devkit-assets/frida-gumjs-example-unix.c +84 -0
  49. package/releng/devkit-assets/frida-gumjs-example-windows.c +91 -0
  50. package/releng/devkit-assets/frida-gumjs-example.sln +28 -0
  51. package/releng/devkit-assets/frida-gumjs-example.vcxproj +157 -0
  52. package/releng/devkit-assets/frida-gumjs-example.vcxproj.filters +27 -0
  53. package/releng/devkit.py +535 -0
  54. package/releng/env.py +420 -0
  55. package/releng/env_android.py +150 -0
  56. package/releng/env_apple.py +176 -0
  57. package/releng/env_generic.py +373 -0
  58. package/releng/frida_version.py +69 -0
  59. package/releng/machine_file.py +44 -0
  60. package/releng/machine_spec.py +290 -0
  61. package/releng/meson/meson.py +27 -0
  62. package/releng/meson/mesonbuild/__init__.py +0 -0
  63. package/releng/meson/mesonbuild/_pathlib.py +63 -0
  64. package/releng/meson/mesonbuild/_typing.py +69 -0
  65. package/releng/meson/mesonbuild/arglist.py +321 -0
  66. package/releng/meson/mesonbuild/ast/__init__.py +23 -0
  67. package/releng/meson/mesonbuild/ast/interpreter.py +441 -0
  68. package/releng/meson/mesonbuild/ast/introspection.py +374 -0
  69. package/releng/meson/mesonbuild/ast/postprocess.py +109 -0
  70. package/releng/meson/mesonbuild/ast/printer.py +620 -0
  71. package/releng/meson/mesonbuild/ast/visitor.py +161 -0
  72. package/releng/meson/mesonbuild/backend/__init__.py +0 -0
  73. package/releng/meson/mesonbuild/backend/backends.py +2047 -0
  74. package/releng/meson/mesonbuild/backend/ninjabackend.py +3808 -0
  75. package/releng/meson/mesonbuild/backend/nonebackend.py +26 -0
  76. package/releng/meson/mesonbuild/backend/vs2010backend.py +2078 -0
  77. package/releng/meson/mesonbuild/backend/vs2012backend.py +35 -0
  78. package/releng/meson/mesonbuild/backend/vs2013backend.py +34 -0
  79. package/releng/meson/mesonbuild/backend/vs2015backend.py +35 -0
  80. package/releng/meson/mesonbuild/backend/vs2017backend.py +59 -0
  81. package/releng/meson/mesonbuild/backend/vs2019backend.py +54 -0
  82. package/releng/meson/mesonbuild/backend/vs2022backend.py +54 -0
  83. package/releng/meson/mesonbuild/backend/xcodebackend.py +1781 -0
  84. package/releng/meson/mesonbuild/build.py +3249 -0
  85. package/releng/meson/mesonbuild/cargo/__init__.py +5 -0
  86. package/releng/meson/mesonbuild/cargo/builder.py +238 -0
  87. package/releng/meson/mesonbuild/cargo/cfg.py +274 -0
  88. package/releng/meson/mesonbuild/cargo/interpreter.py +733 -0
  89. package/releng/meson/mesonbuild/cargo/manifest.py +227 -0
  90. package/releng/meson/mesonbuild/cargo/version.py +95 -0
  91. package/releng/meson/mesonbuild/cmake/__init__.py +28 -0
  92. package/releng/meson/mesonbuild/cmake/common.py +331 -0
  93. package/releng/meson/mesonbuild/cmake/data/__init__.py +0 -0
  94. package/releng/meson/mesonbuild/cmake/data/preload.cmake +82 -0
  95. package/releng/meson/mesonbuild/cmake/executor.py +241 -0
  96. package/releng/meson/mesonbuild/cmake/fileapi.py +324 -0
  97. package/releng/meson/mesonbuild/cmake/generator.py +186 -0
  98. package/releng/meson/mesonbuild/cmake/interpreter.py +1267 -0
  99. package/releng/meson/mesonbuild/cmake/toolchain.py +248 -0
  100. package/releng/meson/mesonbuild/cmake/traceparser.py +814 -0
  101. package/releng/meson/mesonbuild/cmake/tracetargets.py +161 -0
  102. package/releng/meson/mesonbuild/compilers/__init__.py +86 -0
  103. package/releng/meson/mesonbuild/compilers/asm.py +307 -0
  104. package/releng/meson/mesonbuild/compilers/c.py +788 -0
  105. package/releng/meson/mesonbuild/compilers/c_function_attributes.py +143 -0
  106. package/releng/meson/mesonbuild/compilers/compilers.py +1388 -0
  107. package/releng/meson/mesonbuild/compilers/cpp.py +1035 -0
  108. package/releng/meson/mesonbuild/compilers/cs.py +136 -0
  109. package/releng/meson/mesonbuild/compilers/cuda.py +806 -0
  110. package/releng/meson/mesonbuild/compilers/cython.py +91 -0
  111. package/releng/meson/mesonbuild/compilers/d.py +861 -0
  112. package/releng/meson/mesonbuild/compilers/detect.py +1396 -0
  113. package/releng/meson/mesonbuild/compilers/fortran.py +523 -0
  114. package/releng/meson/mesonbuild/compilers/java.py +113 -0
  115. package/releng/meson/mesonbuild/compilers/mixins/__init__.py +0 -0
  116. package/releng/meson/mesonbuild/compilers/mixins/arm.py +167 -0
  117. package/releng/meson/mesonbuild/compilers/mixins/ccrx.py +113 -0
  118. package/releng/meson/mesonbuild/compilers/mixins/clang.py +170 -0
  119. package/releng/meson/mesonbuild/compilers/mixins/clike.py +1330 -0
  120. package/releng/meson/mesonbuild/compilers/mixins/compcert.py +117 -0
  121. package/releng/meson/mesonbuild/compilers/mixins/elbrus.py +93 -0
  122. package/releng/meson/mesonbuild/compilers/mixins/emscripten.py +89 -0
  123. package/releng/meson/mesonbuild/compilers/mixins/gnu.py +629 -0
  124. package/releng/meson/mesonbuild/compilers/mixins/intel.py +167 -0
  125. package/releng/meson/mesonbuild/compilers/mixins/islinker.py +120 -0
  126. package/releng/meson/mesonbuild/compilers/mixins/metrowerks.py +279 -0
  127. package/releng/meson/mesonbuild/compilers/mixins/pgi.py +88 -0
  128. package/releng/meson/mesonbuild/compilers/mixins/ti.py +130 -0
  129. package/releng/meson/mesonbuild/compilers/mixins/visualstudio.py +458 -0
  130. package/releng/meson/mesonbuild/compilers/mixins/xc16.py +111 -0
  131. package/releng/meson/mesonbuild/compilers/objc.py +120 -0
  132. package/releng/meson/mesonbuild/compilers/objcpp.py +102 -0
  133. package/releng/meson/mesonbuild/compilers/rust.py +230 -0
  134. package/releng/meson/mesonbuild/compilers/swift.py +131 -0
  135. package/releng/meson/mesonbuild/compilers/vala.py +121 -0
  136. package/releng/meson/mesonbuild/coredata.py +1532 -0
  137. package/releng/meson/mesonbuild/dependencies/__init__.py +252 -0
  138. package/releng/meson/mesonbuild/dependencies/base.py +663 -0
  139. package/releng/meson/mesonbuild/dependencies/boost.py +1083 -0
  140. package/releng/meson/mesonbuild/dependencies/cmake.py +656 -0
  141. package/releng/meson/mesonbuild/dependencies/coarrays.py +80 -0
  142. package/releng/meson/mesonbuild/dependencies/configtool.py +163 -0
  143. package/releng/meson/mesonbuild/dependencies/cuda.py +295 -0
  144. package/releng/meson/mesonbuild/dependencies/data/CMakeLists.txt +102 -0
  145. package/releng/meson/mesonbuild/dependencies/data/CMakeListsLLVM.txt +204 -0
  146. package/releng/meson/mesonbuild/dependencies/data/CMakePathInfo.txt +31 -0
  147. package/releng/meson/mesonbuild/dependencies/data/__init__.py +0 -0
  148. package/releng/meson/mesonbuild/dependencies/detect.py +225 -0
  149. package/releng/meson/mesonbuild/dependencies/dev.py +707 -0
  150. package/releng/meson/mesonbuild/dependencies/dub.py +424 -0
  151. package/releng/meson/mesonbuild/dependencies/factory.py +146 -0
  152. package/releng/meson/mesonbuild/dependencies/framework.py +111 -0
  153. package/releng/meson/mesonbuild/dependencies/hdf5.py +168 -0
  154. package/releng/meson/mesonbuild/dependencies/misc.py +618 -0
  155. package/releng/meson/mesonbuild/dependencies/mpi.py +231 -0
  156. package/releng/meson/mesonbuild/dependencies/pkgconfig.py +570 -0
  157. package/releng/meson/mesonbuild/dependencies/platform.py +52 -0
  158. package/releng/meson/mesonbuild/dependencies/python.py +431 -0
  159. package/releng/meson/mesonbuild/dependencies/qt.py +484 -0
  160. package/releng/meson/mesonbuild/dependencies/scalapack.py +142 -0
  161. package/releng/meson/mesonbuild/dependencies/ui.py +281 -0
  162. package/releng/meson/mesonbuild/depfile.py +82 -0
  163. package/releng/meson/mesonbuild/envconfig.py +480 -0
  164. package/releng/meson/mesonbuild/environment.py +987 -0
  165. package/releng/meson/mesonbuild/interpreter/__init__.py +47 -0
  166. package/releng/meson/mesonbuild/interpreter/compiler.py +900 -0
  167. package/releng/meson/mesonbuild/interpreter/dependencyfallbacks.py +386 -0
  168. package/releng/meson/mesonbuild/interpreter/interpreter.py +3595 -0
  169. package/releng/meson/mesonbuild/interpreter/interpreterobjects.py +1096 -0
  170. package/releng/meson/mesonbuild/interpreter/kwargs.py +479 -0
  171. package/releng/meson/mesonbuild/interpreter/mesonmain.py +487 -0
  172. package/releng/meson/mesonbuild/interpreter/primitives/__init__.py +29 -0
  173. package/releng/meson/mesonbuild/interpreter/primitives/array.py +108 -0
  174. package/releng/meson/mesonbuild/interpreter/primitives/boolean.py +52 -0
  175. package/releng/meson/mesonbuild/interpreter/primitives/dict.py +88 -0
  176. package/releng/meson/mesonbuild/interpreter/primitives/integer.py +86 -0
  177. package/releng/meson/mesonbuild/interpreter/primitives/range.py +38 -0
  178. package/releng/meson/mesonbuild/interpreter/primitives/string.py +247 -0
  179. package/releng/meson/mesonbuild/interpreter/type_checking.py +853 -0
  180. package/releng/meson/mesonbuild/interpreterbase/__init__.py +126 -0
  181. package/releng/meson/mesonbuild/interpreterbase/_unholder.py +25 -0
  182. package/releng/meson/mesonbuild/interpreterbase/baseobjects.py +174 -0
  183. package/releng/meson/mesonbuild/interpreterbase/decorators.py +806 -0
  184. package/releng/meson/mesonbuild/interpreterbase/disabler.py +35 -0
  185. package/releng/meson/mesonbuild/interpreterbase/exceptions.py +22 -0
  186. package/releng/meson/mesonbuild/interpreterbase/helpers.py +67 -0
  187. package/releng/meson/mesonbuild/interpreterbase/interpreterbase.py +665 -0
  188. package/releng/meson/mesonbuild/interpreterbase/operator.py +32 -0
  189. package/releng/meson/mesonbuild/linkers/__init__.py +20 -0
  190. package/releng/meson/mesonbuild/linkers/base.py +39 -0
  191. package/releng/meson/mesonbuild/linkers/detect.py +229 -0
  192. package/releng/meson/mesonbuild/linkers/linkers.py +1614 -0
  193. package/releng/meson/mesonbuild/mcompile.py +380 -0
  194. package/releng/meson/mesonbuild/mconf.py +368 -0
  195. package/releng/meson/mesonbuild/mdevenv.py +234 -0
  196. package/releng/meson/mesonbuild/mdist.py +376 -0
  197. package/releng/meson/mesonbuild/mesondata.py +38 -0
  198. package/releng/meson/mesonbuild/mesonlib.py +23 -0
  199. package/releng/meson/mesonbuild/mesonmain.py +289 -0
  200. package/releng/meson/mesonbuild/minit.py +204 -0
  201. package/releng/meson/mesonbuild/minstall.py +864 -0
  202. package/releng/meson/mesonbuild/mintro.py +667 -0
  203. package/releng/meson/mesonbuild/mlog.py +542 -0
  204. package/releng/meson/mesonbuild/modules/__init__.py +270 -0
  205. package/releng/meson/mesonbuild/modules/cmake.py +442 -0
  206. package/releng/meson/mesonbuild/modules/cuda.py +377 -0
  207. package/releng/meson/mesonbuild/modules/dlang.py +117 -0
  208. package/releng/meson/mesonbuild/modules/external_project.py +306 -0
  209. package/releng/meson/mesonbuild/modules/fs.py +323 -0
  210. package/releng/meson/mesonbuild/modules/gnome.py +2215 -0
  211. package/releng/meson/mesonbuild/modules/hotdoc.py +487 -0
  212. package/releng/meson/mesonbuild/modules/i18n.py +405 -0
  213. package/releng/meson/mesonbuild/modules/icestorm.py +123 -0
  214. package/releng/meson/mesonbuild/modules/java.py +112 -0
  215. package/releng/meson/mesonbuild/modules/keyval.py +65 -0
  216. package/releng/meson/mesonbuild/modules/modtest.py +33 -0
  217. package/releng/meson/mesonbuild/modules/pkgconfig.py +744 -0
  218. package/releng/meson/mesonbuild/modules/python.py +556 -0
  219. package/releng/meson/mesonbuild/modules/python3.py +85 -0
  220. package/releng/meson/mesonbuild/modules/qt.py +621 -0
  221. package/releng/meson/mesonbuild/modules/qt4.py +23 -0
  222. package/releng/meson/mesonbuild/modules/qt5.py +23 -0
  223. package/releng/meson/mesonbuild/modules/qt6.py +22 -0
  224. package/releng/meson/mesonbuild/modules/rust.py +355 -0
  225. package/releng/meson/mesonbuild/modules/simd.py +114 -0
  226. package/releng/meson/mesonbuild/modules/sourceset.py +291 -0
  227. package/releng/meson/mesonbuild/modules/wayland.py +151 -0
  228. package/releng/meson/mesonbuild/modules/windows.py +207 -0
  229. package/releng/meson/mesonbuild/mparser.py +1114 -0
  230. package/releng/meson/mesonbuild/msetup.py +365 -0
  231. package/releng/meson/mesonbuild/msubprojects.py +764 -0
  232. package/releng/meson/mesonbuild/mtest.py +2201 -0
  233. package/releng/meson/mesonbuild/munstable_coredata.py +107 -0
  234. package/releng/meson/mesonbuild/optinterpreter.py +276 -0
  235. package/releng/meson/mesonbuild/programs.py +367 -0
  236. package/releng/meson/mesonbuild/rewriter.py +1075 -0
  237. package/releng/meson/mesonbuild/scripts/__init__.py +10 -0
  238. package/releng/meson/mesonbuild/scripts/clangformat.py +55 -0
  239. package/releng/meson/mesonbuild/scripts/clangtidy.py +30 -0
  240. package/releng/meson/mesonbuild/scripts/cleantrees.py +35 -0
  241. package/releng/meson/mesonbuild/scripts/cmake_run_ctgt.py +103 -0
  242. package/releng/meson/mesonbuild/scripts/cmd_or_ps.ps1 +17 -0
  243. package/releng/meson/mesonbuild/scripts/copy.py +19 -0
  244. package/releng/meson/mesonbuild/scripts/coverage.py +214 -0
  245. package/releng/meson/mesonbuild/scripts/delwithsuffix.py +27 -0
  246. package/releng/meson/mesonbuild/scripts/depfixer.py +495 -0
  247. package/releng/meson/mesonbuild/scripts/depscan.py +198 -0
  248. package/releng/meson/mesonbuild/scripts/dirchanger.py +20 -0
  249. package/releng/meson/mesonbuild/scripts/env2mfile.py +402 -0
  250. package/releng/meson/mesonbuild/scripts/externalproject.py +106 -0
  251. package/releng/meson/mesonbuild/scripts/gettext.py +86 -0
  252. package/releng/meson/mesonbuild/scripts/gtkdochelper.py +286 -0
  253. package/releng/meson/mesonbuild/scripts/hotdochelper.py +40 -0
  254. package/releng/meson/mesonbuild/scripts/itstool.py +77 -0
  255. package/releng/meson/mesonbuild/scripts/meson_exe.py +115 -0
  256. package/releng/meson/mesonbuild/scripts/msgfmthelper.py +29 -0
  257. package/releng/meson/mesonbuild/scripts/pycompile.py +54 -0
  258. package/releng/meson/mesonbuild/scripts/python_info.py +121 -0
  259. package/releng/meson/mesonbuild/scripts/regen_checker.py +55 -0
  260. package/releng/meson/mesonbuild/scripts/run_tool.py +58 -0
  261. package/releng/meson/mesonbuild/scripts/scanbuild.py +57 -0
  262. package/releng/meson/mesonbuild/scripts/symbolextractor.py +322 -0
  263. package/releng/meson/mesonbuild/scripts/tags.py +44 -0
  264. package/releng/meson/mesonbuild/scripts/test_loaded_modules.py +14 -0
  265. package/releng/meson/mesonbuild/scripts/uninstall.py +41 -0
  266. package/releng/meson/mesonbuild/scripts/vcstagger.py +35 -0
  267. package/releng/meson/mesonbuild/scripts/yasm.py +24 -0
  268. package/releng/meson/mesonbuild/templates/__init__.py +0 -0
  269. package/releng/meson/mesonbuild/templates/cpptemplates.py +143 -0
  270. package/releng/meson/mesonbuild/templates/cstemplates.py +90 -0
  271. package/releng/meson/mesonbuild/templates/ctemplates.py +126 -0
  272. package/releng/meson/mesonbuild/templates/cudatemplates.py +143 -0
  273. package/releng/meson/mesonbuild/templates/dlangtemplates.py +109 -0
  274. package/releng/meson/mesonbuild/templates/fortrantemplates.py +101 -0
  275. package/releng/meson/mesonbuild/templates/javatemplates.py +94 -0
  276. package/releng/meson/mesonbuild/templates/mesontemplates.py +70 -0
  277. package/releng/meson/mesonbuild/templates/objcpptemplates.py +126 -0
  278. package/releng/meson/mesonbuild/templates/objctemplates.py +126 -0
  279. package/releng/meson/mesonbuild/templates/rusttemplates.py +79 -0
  280. package/releng/meson/mesonbuild/templates/samplefactory.py +41 -0
  281. package/releng/meson/mesonbuild/templates/sampleimpl.py +160 -0
  282. package/releng/meson/mesonbuild/templates/valatemplates.py +82 -0
  283. package/releng/meson/mesonbuild/utils/__init__.py +0 -0
  284. package/releng/meson/mesonbuild/utils/core.py +166 -0
  285. package/releng/meson/mesonbuild/utils/platform.py +27 -0
  286. package/releng/meson/mesonbuild/utils/posix.py +32 -0
  287. package/releng/meson/mesonbuild/utils/universal.py +2445 -0
  288. package/releng/meson/mesonbuild/utils/vsenv.py +126 -0
  289. package/releng/meson/mesonbuild/utils/win32.py +29 -0
  290. package/releng/meson/mesonbuild/wrap/__init__.py +59 -0
  291. package/releng/meson/mesonbuild/wrap/wrap.py +846 -0
  292. package/releng/meson/mesonbuild/wrap/wraptool.py +198 -0
  293. package/releng/meson-scripts/BSDmakefile +6 -0
  294. package/releng/meson-scripts/Makefile +16 -0
  295. package/releng/meson-scripts/configure +18 -0
  296. package/releng/meson-scripts/configure.bat +22 -0
  297. package/releng/meson-scripts/make.bat +23 -0
  298. package/releng/meson_configure.py +506 -0
  299. package/releng/meson_make.py +131 -0
  300. package/releng/mkdevkit.py +107 -0
  301. package/releng/mkfatmacho.py +54 -0
  302. package/releng/post-process-oabi.py +97 -0
  303. package/releng/progress.py +14 -0
  304. package/releng/sync-from-upstream.py +185 -0
  305. package/releng/tomlkit/tomlkit/__init__.py +59 -0
  306. package/releng/tomlkit/tomlkit/_compat.py +22 -0
  307. package/releng/tomlkit/tomlkit/_types.py +83 -0
  308. package/releng/tomlkit/tomlkit/_utils.py +158 -0
  309. package/releng/tomlkit/tomlkit/api.py +308 -0
  310. package/releng/tomlkit/tomlkit/container.py +875 -0
  311. package/releng/tomlkit/tomlkit/exceptions.py +227 -0
  312. package/releng/tomlkit/tomlkit/items.py +1967 -0
  313. package/releng/tomlkit/tomlkit/parser.py +1141 -0
  314. package/releng/tomlkit/tomlkit/py.typed +0 -0
  315. package/releng/tomlkit/tomlkit/source.py +180 -0
  316. package/releng/tomlkit/tomlkit/toml_char.py +52 -0
  317. package/releng/tomlkit/tomlkit/toml_document.py +7 -0
  318. package/releng/tomlkit/tomlkit/toml_file.py +58 -0
  319. package/releng/winenv.py +140 -0
  320. package/scripts/adjust-version.py +19 -0
  321. package/scripts/detect-version.py +40 -0
  322. package/scripts/fetch-abi-bits.py +343 -0
  323. package/scripts/install.js +23 -0
  324. package/scripts/package.py +15 -0
  325. package/src/addon.cc +76 -0
  326. package/src/application.cc +148 -0
  327. package/src/application.h +31 -0
  328. package/src/authentication.cc +174 -0
  329. package/src/authentication.h +24 -0
  330. package/src/bus.cc +167 -0
  331. package/src/bus.h +33 -0
  332. package/src/cancellable.cc +117 -0
  333. package/src/cancellable.h +31 -0
  334. package/src/child.cc +150 -0
  335. package/src/child.h +32 -0
  336. package/src/crash.cc +122 -0
  337. package/src/crash.h +30 -0
  338. package/src/device.cc +1302 -0
  339. package/src/device.h +55 -0
  340. package/src/device_manager.cc +362 -0
  341. package/src/device_manager.h +35 -0
  342. package/src/endpoint_parameters.cc +171 -0
  343. package/src/endpoint_parameters.h +28 -0
  344. package/src/glib_context.cc +62 -0
  345. package/src/glib_context.h +29 -0
  346. package/src/glib_object.cc +25 -0
  347. package/src/glib_object.h +37 -0
  348. package/src/iostream.cc +247 -0
  349. package/src/iostream.h +30 -0
  350. package/src/meson.build +26 -0
  351. package/src/operation.h +94 -0
  352. package/src/portal_membership.cc +100 -0
  353. package/src/portal_membership.h +26 -0
  354. package/src/portal_service.cc +401 -0
  355. package/src/portal_service.h +40 -0
  356. package/src/process.cc +135 -0
  357. package/src/process.h +30 -0
  358. package/src/relay.cc +139 -0
  359. package/src/relay.h +31 -0
  360. package/src/runtime.cc +443 -0
  361. package/src/runtime.h +64 -0
  362. package/src/script.cc +301 -0
  363. package/src/script.h +36 -0
  364. package/src/session.cc +860 -0
  365. package/src/session.h +42 -0
  366. package/src/signals.cc +334 -0
  367. package/src/signals.h +47 -0
  368. package/src/spawn.cc +95 -0
  369. package/src/spawn.h +27 -0
  370. package/src/usage_monitor.h +117 -0
  371. package/src/uv_context.cc +118 -0
  372. package/src/uv_context.h +40 -0
  373. package/src/win_delay_load_hook.cc +63 -0
  374. package/subprojects/frida-core.wrap +8 -0
  375. package/subprojects/nan.wrap +9 -0
  376. package/subprojects/packagefiles/nan.patch +13 -0
  377. package/test/data/index.ts +13 -0
  378. package/test/data/unixvictim-linux-x86 +0 -0
  379. package/test/data/unixvictim-linux-x86_64 +0 -0
  380. package/test/data/unixvictim-macos +0 -0
  381. package/test/device.ts +27 -0
  382. package/test/device_manager.ts +16 -0
  383. package/test/labrat.ts +32 -0
  384. package/test/script.ts +176 -0
  385. package/test/session.ts +73 -0
  386. package/tsconfig.json +18 -0
@@ -0,0 +1,1614 @@
1
+ # SPDX-License-Identifier: Apache-2.0
2
+ # Copyright 2012-2022 The Meson development team
3
+
4
+ from __future__ import annotations
5
+
6
+ import abc
7
+ import os
8
+ import typing as T
9
+ import re
10
+
11
+ from .base import ArLikeLinker, RSPFileSyntax
12
+ from .. import mesonlib
13
+ from ..mesonlib import EnvironmentException, MesonException
14
+ from ..arglist import CompilerArgs
15
+
16
+ if T.TYPE_CHECKING:
17
+ from ..coredata import KeyedOptionDictType
18
+ from ..environment import Environment
19
+ from ..mesonlib import MachineChoice
20
+
21
+
22
+ class StaticLinker:
23
+
24
+ id: str
25
+
26
+ def __init__(self, exelist: T.List[str]):
27
+ self.exelist = exelist
28
+
29
+ def compiler_args(self, args: T.Optional[T.Iterable[str]] = None) -> CompilerArgs:
30
+ return CompilerArgs(self, args)
31
+
32
+ def can_linker_accept_rsp(self) -> bool:
33
+ """
34
+ Determines whether the linker can accept arguments using the @rsp syntax.
35
+ """
36
+ return mesonlib.is_windows()
37
+
38
+ def get_base_link_args(self, options: 'KeyedOptionDictType') -> T.List[str]:
39
+ """Like compilers.get_base_link_args, but for the static linker."""
40
+ return []
41
+
42
+ def get_exelist(self) -> T.List[str]:
43
+ return self.exelist.copy()
44
+
45
+ def get_std_link_args(self, env: 'Environment', is_thin: bool) -> T.List[str]:
46
+ return []
47
+
48
+ def get_optimization_link_args(self, optimization_level: str) -> T.List[str]:
49
+ return []
50
+
51
+ def get_output_args(self, target: str) -> T.List[str]:
52
+ return []
53
+
54
+ def get_coverage_link_args(self) -> T.List[str]:
55
+ return []
56
+
57
+ def build_rpath_args(self, env: 'Environment', build_dir: str, from_dir: str,
58
+ rpath_paths: T.Tuple[str, ...], build_rpath: str,
59
+ install_rpath: str) -> T.Tuple[T.List[str], T.Set[bytes]]:
60
+ return ([], set())
61
+
62
+ def thread_link_flags(self, env: 'Environment') -> T.List[str]:
63
+ return []
64
+
65
+ def openmp_flags(self) -> T.List[str]:
66
+ return []
67
+
68
+ def get_option_link_args(self, options: 'KeyedOptionDictType') -> T.List[str]:
69
+ return []
70
+
71
+ @classmethod
72
+ def unix_args_to_native(cls, args: T.List[str]) -> T.List[str]:
73
+ return args[:]
74
+
75
+ @classmethod
76
+ def native_args_to_unix(cls, args: T.List[str]) -> T.List[str]:
77
+ return args[:]
78
+
79
+ def get_link_debugfile_name(self, targetfile: str) -> T.Optional[str]:
80
+ return None
81
+
82
+ def get_link_debugfile_args(self, targetfile: str) -> T.List[str]:
83
+ # Static libraries do not have PDB files
84
+ return []
85
+
86
+ def get_always_args(self) -> T.List[str]:
87
+ return []
88
+
89
+ def get_linker_always_args(self) -> T.List[str]:
90
+ return []
91
+
92
+ def rsp_file_syntax(self) -> RSPFileSyntax:
93
+ """The format of the RSP file that this compiler supports.
94
+
95
+ If `self.can_linker_accept_rsp()` returns True, then this needs to
96
+ be implemented
97
+ """
98
+ assert not self.can_linker_accept_rsp(), f'{self.id} linker accepts RSP, but doesn\' provide a supported format, this is a bug'
99
+ raise EnvironmentException(f'{self.id} does not implement rsp format, this shouldn\'t be called')
100
+
101
+
102
+ class DynamicLinker(metaclass=abc.ABCMeta):
103
+
104
+ """Base class for dynamic linkers."""
105
+
106
+ _OPTIMIZATION_ARGS: T.Dict[str, T.List[str]] = {
107
+ 'plain': [],
108
+ '0': [],
109
+ 'g': [],
110
+ '1': [],
111
+ '2': [],
112
+ '3': [],
113
+ 's': [],
114
+ }
115
+
116
+ @abc.abstractproperty
117
+ def id(self) -> str:
118
+ pass
119
+
120
+ def _apply_prefix(self, arg: T.Union[str, T.List[str]]) -> T.List[str]:
121
+ args = [arg] if isinstance(arg, str) else arg
122
+ if self.prefix_arg is None:
123
+ return args
124
+ elif isinstance(self.prefix_arg, str):
125
+ return [self.prefix_arg + arg for arg in args]
126
+ ret: T.List[str] = []
127
+ for arg in args:
128
+ ret += self.prefix_arg + [arg]
129
+ return ret
130
+
131
+ def __init__(self, exelist: T.List[str],
132
+ for_machine: mesonlib.MachineChoice, prefix_arg: T.Union[str, T.List[str]],
133
+ always_args: T.List[str], *, version: str = 'unknown version'):
134
+ self.exelist = exelist
135
+ self.for_machine = for_machine
136
+ self.version = version
137
+ self.prefix_arg = prefix_arg
138
+ self.always_args = always_args
139
+ self.machine: T.Optional[str] = None
140
+
141
+ def __repr__(self) -> str:
142
+ return '<{}: v{} `{}`>'.format(type(self).__name__, self.version, ' '.join(self.exelist))
143
+
144
+ def get_id(self) -> str:
145
+ return self.id
146
+
147
+ def get_version_string(self) -> str:
148
+ return f'({self.id} {self.version})'
149
+
150
+ def get_exelist(self) -> T.List[str]:
151
+ return self.exelist.copy()
152
+
153
+ def get_accepts_rsp(self) -> bool:
154
+ # rsp files are only used when building on Windows because we want to
155
+ # avoid issues with quoting and max argument length
156
+ return mesonlib.is_windows()
157
+
158
+ def rsp_file_syntax(self) -> RSPFileSyntax:
159
+ """The format of the RSP file that this compiler supports.
160
+
161
+ If `self.can_linker_accept_rsp()` returns True, then this needs to
162
+ be implemented
163
+ """
164
+ return RSPFileSyntax.GCC
165
+
166
+ def get_always_args(self) -> T.List[str]:
167
+ return self.always_args.copy()
168
+
169
+ def get_lib_prefix(self) -> str:
170
+ return ''
171
+
172
+ # XXX: is use_ldflags a compiler or a linker attribute?
173
+
174
+ def get_option_args(self, options: 'KeyedOptionDictType') -> T.List[str]:
175
+ return []
176
+
177
+ def has_multi_arguments(self, args: T.List[str], env: 'Environment') -> T.Tuple[bool, bool]:
178
+ raise EnvironmentException(f'Language {self.id} does not support has_multi_link_arguments.')
179
+
180
+ def get_debugfile_name(self, targetfile: str) -> T.Optional[str]:
181
+ '''Name of debug file written out (see below)'''
182
+ return None
183
+
184
+ def get_debugfile_args(self, targetfile: str) -> T.List[str]:
185
+ """Some compilers (MSVC) write debug into a separate file.
186
+
187
+ This method takes the target object path and returns a list of
188
+ commands to append to the linker invocation to control where that
189
+ file is written.
190
+ """
191
+ return []
192
+
193
+ def get_optimization_link_args(self, optimization_level: str) -> T.List[str]:
194
+ # We can override these in children by just overriding the
195
+ # _OPTIMIZATION_ARGS value.
196
+ return mesonlib.listify([self._apply_prefix(a) for a in self._OPTIMIZATION_ARGS[optimization_level]])
197
+
198
+ def get_std_shared_lib_args(self) -> T.List[str]:
199
+ return []
200
+
201
+ def get_std_shared_module_args(self, options: 'KeyedOptionDictType') -> T.List[str]:
202
+ return self.get_std_shared_lib_args()
203
+
204
+ def get_pie_args(self) -> T.List[str]:
205
+ # TODO: this really needs to take a boolean and return the args to
206
+ # disable pie, otherwise it only acts to enable pie if pie *isn't* the
207
+ # default.
208
+ raise EnvironmentException(f'Linker {self.id} does not support position-independent executable')
209
+
210
+ def get_lto_args(self) -> T.List[str]:
211
+ return []
212
+
213
+ def get_thinlto_cache_args(self, path: str) -> T.List[str]:
214
+ return []
215
+
216
+ def sanitizer_args(self, value: str) -> T.List[str]:
217
+ return []
218
+
219
+ def get_asneeded_args(self) -> T.List[str]:
220
+ return []
221
+
222
+ def get_link_whole_for(self, args: T.List[str]) -> T.List[str]:
223
+ raise EnvironmentException(
224
+ f'Linker {self.id} does not support link_whole')
225
+
226
+ def get_allow_undefined_args(self) -> T.List[str]:
227
+ raise EnvironmentException(
228
+ f'Linker {self.id} does not support allow undefined')
229
+
230
+ @abc.abstractmethod
231
+ def get_output_args(self, outputname: str) -> T.List[str]:
232
+ pass
233
+
234
+ def get_coverage_args(self) -> T.List[str]:
235
+ raise EnvironmentException(f"Linker {self.id} doesn't implement coverage data generation.")
236
+
237
+ @abc.abstractmethod
238
+ def get_search_args(self, dirname: str) -> T.List[str]:
239
+ pass
240
+
241
+ def export_dynamic_args(self, env: 'Environment') -> T.List[str]:
242
+ return []
243
+
244
+ def import_library_args(self, implibname: str) -> T.List[str]:
245
+ """The name of the outputted import library.
246
+
247
+ This implementation is used only on Windows by compilers that use GNU ld
248
+ """
249
+ return []
250
+
251
+ def thread_flags(self, env: 'Environment') -> T.List[str]:
252
+ return []
253
+
254
+ def no_undefined_args(self) -> T.List[str]:
255
+ """Arguments to error if there are any undefined symbols at link time.
256
+
257
+ This is the inverse of get_allow_undefined_args().
258
+
259
+ TODO: A future cleanup might merge this and
260
+ get_allow_undefined_args() into a single method taking a
261
+ boolean
262
+ """
263
+ return []
264
+
265
+ def fatal_warnings(self) -> T.List[str]:
266
+ """Arguments to make all warnings errors."""
267
+ return []
268
+
269
+ def headerpad_args(self) -> T.List[str]:
270
+ # Only used by the Apple linker
271
+ return []
272
+
273
+ def get_win_subsystem_args(self, value: str) -> T.List[str]:
274
+ # Only used if supported by the dynamic linker and
275
+ # only when targeting Windows
276
+ return []
277
+
278
+ def bitcode_args(self) -> T.List[str]:
279
+ raise MesonException('This linker does not support bitcode bundles')
280
+
281
+ def build_rpath_args(self, env: 'Environment', build_dir: str, from_dir: str,
282
+ rpath_paths: T.Tuple[str, ...], build_rpath: str,
283
+ install_rpath: str) -> T.Tuple[T.List[str], T.Set[bytes]]:
284
+ return ([], set())
285
+
286
+ def get_soname_args(self, env: 'Environment', prefix: str, shlib_name: str,
287
+ suffix: str, soversion: str, darwin_versions: T.Tuple[str, str]) -> T.List[str]:
288
+ return []
289
+
290
+ def get_archive_name(self, filename: str) -> str:
291
+ #Only used by AIX.
292
+ return str()
293
+
294
+ def get_command_to_archive_shlib(self) -> T.List[str]:
295
+ #Only used by AIX.
296
+ return []
297
+
298
+
299
+ if T.TYPE_CHECKING:
300
+ StaticLinkerBase = StaticLinker
301
+ DynamicLinkerBase = DynamicLinker
302
+ else:
303
+ StaticLinkerBase = DynamicLinkerBase = object
304
+
305
+
306
+ class VisualStudioLikeLinker(StaticLinkerBase):
307
+ always_args = ['/NOLOGO']
308
+
309
+ def __init__(self, machine: str):
310
+ self.machine = machine
311
+
312
+ def get_always_args(self) -> T.List[str]:
313
+ return self.always_args.copy()
314
+
315
+ def get_linker_always_args(self) -> T.List[str]:
316
+ return self.always_args.copy()
317
+
318
+ def get_output_args(self, target: str) -> T.List[str]:
319
+ args: T.List[str] = []
320
+ if self.machine:
321
+ args += ['/MACHINE:' + self.machine]
322
+ args += ['/OUT:' + target]
323
+ return args
324
+
325
+ @classmethod
326
+ def unix_args_to_native(cls, args: T.List[str]) -> T.List[str]:
327
+ from ..compilers.c import VisualStudioCCompiler
328
+ return VisualStudioCCompiler.unix_args_to_native(args)
329
+
330
+ @classmethod
331
+ def native_args_to_unix(cls, args: T.List[str]) -> T.List[str]:
332
+ from ..compilers.c import VisualStudioCCompiler
333
+ return VisualStudioCCompiler.native_args_to_unix(args)
334
+
335
+ def rsp_file_syntax(self) -> RSPFileSyntax:
336
+ return RSPFileSyntax.MSVC
337
+
338
+
339
+ class VisualStudioLinker(VisualStudioLikeLinker, StaticLinker):
340
+
341
+ """Microsoft's lib static linker."""
342
+
343
+ id = 'lib'
344
+
345
+ def __init__(self, exelist: T.List[str], machine: str):
346
+ StaticLinker.__init__(self, exelist)
347
+ VisualStudioLikeLinker.__init__(self, machine)
348
+
349
+
350
+ class IntelVisualStudioLinker(VisualStudioLikeLinker, StaticLinker):
351
+
352
+ """Intel's xilib static linker."""
353
+
354
+ id = 'xilib'
355
+
356
+ def __init__(self, exelist: T.List[str], machine: str):
357
+ StaticLinker.__init__(self, exelist)
358
+ VisualStudioLikeLinker.__init__(self, machine)
359
+
360
+
361
+ class ArLinker(ArLikeLinker, StaticLinker):
362
+ id = 'ar'
363
+
364
+ def __init__(self, for_machine: mesonlib.MachineChoice, exelist: T.List[str]):
365
+ super().__init__(exelist)
366
+ stdo = mesonlib.Popen_safe(self.exelist + ['-h'])[1]
367
+ # Enable deterministic builds if they are available.
368
+ stdargs = 'csr'
369
+ thinargs = ''
370
+ if '[D]' in stdo:
371
+ stdargs += 'D'
372
+ if '[T]' in stdo:
373
+ thinargs = 'T'
374
+ self.std_args = [stdargs]
375
+ self.std_thin_args = [stdargs + thinargs]
376
+ self.can_rsp = '@<' in stdo
377
+ self.for_machine = for_machine
378
+
379
+ def can_linker_accept_rsp(self) -> bool:
380
+ return self.can_rsp
381
+
382
+ def get_std_link_args(self, env: 'Environment', is_thin: bool) -> T.List[str]:
383
+ # Thin archives are a GNU extension not supported by the system linkers
384
+ # on Mac OS X, Solaris, or illumos, so don't build them on those OSes.
385
+ # OS X ld rejects with: "file built for unknown-unsupported file format"
386
+ # illumos/Solaris ld rejects with: "unknown file type"
387
+ if is_thin and not env.machines[self.for_machine].is_darwin() \
388
+ and not env.machines[self.for_machine].is_sunos():
389
+ return self.std_thin_args
390
+ else:
391
+ return self.std_args
392
+
393
+
394
+ class AppleArLinker(ArLinker):
395
+
396
+ # mostly this is used to determine that we need to call ranlib
397
+
398
+ id = 'applear'
399
+
400
+
401
+ class ArmarLinker(ArLikeLinker, StaticLinker):
402
+ id = 'armar'
403
+
404
+
405
+ class DLinker(StaticLinker):
406
+ def __init__(self, exelist: T.List[str], arch: str, *, rsp_syntax: RSPFileSyntax = RSPFileSyntax.GCC):
407
+ super().__init__(exelist)
408
+ self.id = exelist[0]
409
+ self.arch = arch
410
+ self.__rsp_syntax = rsp_syntax
411
+
412
+ def get_std_link_args(self, env: 'Environment', is_thin: bool) -> T.List[str]:
413
+ return ['-lib']
414
+
415
+ def get_output_args(self, target: str) -> T.List[str]:
416
+ return ['-of=' + target]
417
+
418
+ def get_linker_always_args(self) -> T.List[str]:
419
+ if mesonlib.is_windows():
420
+ if self.arch == 'x86_64':
421
+ return ['-m64']
422
+ elif self.arch == 'x86_mscoff' and self.id == 'dmd':
423
+ return ['-m32mscoff']
424
+ return ['-m32']
425
+ return []
426
+
427
+ def rsp_file_syntax(self) -> RSPFileSyntax:
428
+ return self.__rsp_syntax
429
+
430
+
431
+ class CcrxLinker(StaticLinker):
432
+
433
+ def __init__(self, exelist: T.List[str]):
434
+ super().__init__(exelist)
435
+ self.id = 'rlink'
436
+
437
+ def can_linker_accept_rsp(self) -> bool:
438
+ return False
439
+
440
+ def get_output_args(self, target: str) -> T.List[str]:
441
+ return [f'-output={target}']
442
+
443
+ def get_linker_always_args(self) -> T.List[str]:
444
+ return ['-nologo', '-form=library']
445
+
446
+
447
+ class Xc16Linker(StaticLinker):
448
+
449
+ def __init__(self, exelist: T.List[str]):
450
+ super().__init__(exelist)
451
+ self.id = 'xc16-ar'
452
+
453
+ def can_linker_accept_rsp(self) -> bool:
454
+ return False
455
+
456
+ def get_output_args(self, target: str) -> T.List[str]:
457
+ return [f'{target}']
458
+
459
+ def get_linker_always_args(self) -> T.List[str]:
460
+ return ['rcs']
461
+
462
+ class CompCertLinker(StaticLinker):
463
+
464
+ def __init__(self, exelist: T.List[str]):
465
+ super().__init__(exelist)
466
+ self.id = 'ccomp'
467
+
468
+ def can_linker_accept_rsp(self) -> bool:
469
+ return False
470
+
471
+ def get_output_args(self, target: str) -> T.List[str]:
472
+ return [f'-o{target}']
473
+
474
+
475
+ class TILinker(StaticLinker):
476
+
477
+ def __init__(self, exelist: T.List[str]):
478
+ super().__init__(exelist)
479
+ self.id = 'ti-ar'
480
+
481
+ def can_linker_accept_rsp(self) -> bool:
482
+ return False
483
+
484
+ def get_output_args(self, target: str) -> T.List[str]:
485
+ return [f'{target}']
486
+
487
+ def get_linker_always_args(self) -> T.List[str]:
488
+ return ['-r']
489
+
490
+
491
+ class C2000Linker(TILinker):
492
+ # Required for backwards compat with projects created before ti-cgt support existed
493
+ id = 'ar2000'
494
+
495
+ class C6000Linker(TILinker):
496
+ id = 'ar6000'
497
+
498
+
499
+ class AIXArLinker(ArLikeLinker, StaticLinker):
500
+ id = 'aixar'
501
+ std_args = ['-csr', '-Xany']
502
+
503
+
504
+ class MetrowerksStaticLinker(StaticLinker):
505
+
506
+ def can_linker_accept_rsp(self) -> bool:
507
+ return True
508
+
509
+ def get_linker_always_args(self) -> T.List[str]:
510
+ return ['-library']
511
+
512
+ def get_output_args(self, target: str) -> T.List[str]:
513
+ return ['-o', target]
514
+
515
+ def rsp_file_syntax(self) -> RSPFileSyntax:
516
+ return RSPFileSyntax.GCC
517
+
518
+
519
+ class MetrowerksStaticLinkerARM(MetrowerksStaticLinker):
520
+ id = 'mwldarm'
521
+
522
+
523
+ class MetrowerksStaticLinkerEmbeddedPowerPC(MetrowerksStaticLinker):
524
+ id = 'mwldeppc'
525
+
526
+ def prepare_rpaths(raw_rpaths: T.Tuple[str, ...], build_dir: str, from_dir: str) -> T.List[str]:
527
+ # The rpaths we write must be relative if they point to the build dir,
528
+ # because otherwise they have different length depending on the build
529
+ # directory. This breaks reproducible builds.
530
+ internal_format_rpaths = [evaluate_rpath(p, build_dir, from_dir) for p in raw_rpaths]
531
+ ordered_rpaths = order_rpaths(internal_format_rpaths)
532
+ return ordered_rpaths
533
+
534
+
535
+ def order_rpaths(rpath_list: T.List[str]) -> T.List[str]:
536
+ # We want rpaths that point inside our build dir to always override
537
+ # those pointing to other places in the file system. This is so built
538
+ # binaries prefer our libraries to the ones that may lie somewhere
539
+ # in the file system, such as /lib/x86_64-linux-gnu.
540
+ #
541
+ # The correct thing to do here would be C++'s std::stable_partition.
542
+ # Python standard library does not have it, so replicate it with
543
+ # sort, which is guaranteed to be stable.
544
+ return sorted(rpath_list, key=os.path.isabs)
545
+
546
+
547
+ def evaluate_rpath(p: str, build_dir: str, from_dir: str) -> str:
548
+ if p == from_dir:
549
+ return '' # relpath errors out in this case
550
+ elif os.path.isabs(p):
551
+ return p # These can be outside of build dir.
552
+ else:
553
+ return os.path.relpath(os.path.join(build_dir, p), os.path.join(build_dir, from_dir))
554
+
555
+
556
+ class PosixDynamicLinkerMixin(DynamicLinkerBase):
557
+
558
+ """Mixin class for POSIX-ish linkers.
559
+
560
+ This is obviously a pretty small subset of the linker interface, but
561
+ enough dynamic linkers that meson supports are POSIX-like but not
562
+ GNU-like that it makes sense to split this out.
563
+ """
564
+
565
+ def get_output_args(self, outputname: str) -> T.List[str]:
566
+ return ['-o', outputname]
567
+
568
+ def get_std_shared_lib_args(self) -> T.List[str]:
569
+ return ['-shared']
570
+
571
+ def get_search_args(self, dirname: str) -> T.List[str]:
572
+ return ['-L' + dirname]
573
+
574
+
575
+ class GnuLikeDynamicLinkerMixin(DynamicLinkerBase):
576
+
577
+ """Mixin class for dynamic linkers that provides gnu-like interface.
578
+
579
+ This acts as a base for the GNU linkers (bfd and gold), LLVM's lld, and
580
+ other linkers like GNU-ld.
581
+ """
582
+
583
+ if T.TYPE_CHECKING:
584
+ for_machine = MachineChoice.HOST
585
+ def _apply_prefix(self, arg: T.Union[str, T.List[str]]) -> T.List[str]: ...
586
+
587
+ _OPTIMIZATION_ARGS: T.Dict[str, T.List[str]] = {
588
+ 'plain': [],
589
+ '0': [],
590
+ 'g': [],
591
+ '1': [],
592
+ '2': [],
593
+ '3': ['-O1'],
594
+ 's': [],
595
+ }
596
+
597
+ _SUBSYSTEMS: T.Dict[str, str] = {
598
+ "native": "1",
599
+ "windows": "windows",
600
+ "console": "console",
601
+ "posix": "7",
602
+ "efi_application": "10",
603
+ "efi_boot_service_driver": "11",
604
+ "efi_runtime_driver": "12",
605
+ "efi_rom": "13",
606
+ "boot_application": "16",
607
+ }
608
+
609
+ def get_pie_args(self) -> T.List[str]:
610
+ return ['-pie']
611
+
612
+ def get_asneeded_args(self) -> T.List[str]:
613
+ return self._apply_prefix('--as-needed')
614
+
615
+ def get_link_whole_for(self, args: T.List[str]) -> T.List[str]:
616
+ if not args:
617
+ return args
618
+ return self._apply_prefix('--whole-archive') + args + self._apply_prefix('--no-whole-archive')
619
+
620
+ def get_allow_undefined_args(self) -> T.List[str]:
621
+ return self._apply_prefix('--allow-shlib-undefined')
622
+
623
+ def get_lto_args(self) -> T.List[str]:
624
+ return ['-flto']
625
+
626
+ def sanitizer_args(self, value: str) -> T.List[str]:
627
+ if value == 'none':
628
+ return []
629
+ return ['-fsanitize=' + value]
630
+
631
+ def get_coverage_args(self) -> T.List[str]:
632
+ return ['--coverage']
633
+
634
+ def export_dynamic_args(self, env: 'Environment') -> T.List[str]:
635
+ m = env.machines[self.for_machine]
636
+ if m.is_windows() or m.is_cygwin():
637
+ return self._apply_prefix('--export-all-symbols')
638
+ return self._apply_prefix('-export-dynamic')
639
+
640
+ def import_library_args(self, implibname: str) -> T.List[str]:
641
+ return self._apply_prefix('--out-implib=' + implibname)
642
+
643
+ def thread_flags(self, env: 'Environment') -> T.List[str]:
644
+ if env.machines[self.for_machine].is_haiku():
645
+ return []
646
+ return ['-pthread']
647
+
648
+ def no_undefined_args(self) -> T.List[str]:
649
+ return self._apply_prefix('--no-undefined')
650
+
651
+ def fatal_warnings(self) -> T.List[str]:
652
+ return self._apply_prefix('--fatal-warnings')
653
+
654
+ def get_soname_args(self, env: 'Environment', prefix: str, shlib_name: str,
655
+ suffix: str, soversion: str, darwin_versions: T.Tuple[str, str]) -> T.List[str]:
656
+ m = env.machines[self.for_machine]
657
+ if m.is_windows() or m.is_cygwin():
658
+ # For PE/COFF the soname argument has no effect
659
+ return []
660
+ sostr = '' if soversion is None else '.' + soversion
661
+ return self._apply_prefix(f'-soname,{prefix}{shlib_name}.{suffix}{sostr}')
662
+
663
+ def build_rpath_args(self, env: 'Environment', build_dir: str, from_dir: str,
664
+ rpath_paths: T.Tuple[str, ...], build_rpath: str,
665
+ install_rpath: str) -> T.Tuple[T.List[str], T.Set[bytes]]:
666
+ m = env.machines[self.for_machine]
667
+ if m.is_windows() or m.is_cygwin():
668
+ return ([], set())
669
+ if not rpath_paths and not install_rpath and not build_rpath:
670
+ return ([], set())
671
+ args: T.List[str] = []
672
+ origin_placeholder = '$ORIGIN'
673
+ processed_rpaths = prepare_rpaths(rpath_paths, build_dir, from_dir)
674
+ # Need to deduplicate rpaths, as macOS's install_name_tool
675
+ # is *very* allergic to duplicate -delete_rpath arguments
676
+ # when calling depfixer on installation.
677
+ all_paths = mesonlib.OrderedSet([os.path.join(origin_placeholder, p) for p in processed_rpaths])
678
+ rpath_dirs_to_remove: T.Set[bytes] = set()
679
+ for p in all_paths:
680
+ rpath_dirs_to_remove.add(p.encode('utf8'))
681
+ # Build_rpath is used as-is (it is usually absolute).
682
+ if build_rpath != '':
683
+ all_paths.add(build_rpath)
684
+ for p in build_rpath.split(':'):
685
+ rpath_dirs_to_remove.add(p.encode('utf8'))
686
+
687
+ # TODO: should this actually be "for (dragonfly|open)bsd"?
688
+ if mesonlib.is_dragonflybsd() or mesonlib.is_openbsd():
689
+ # This argument instructs the compiler to record the value of
690
+ # ORIGIN in the .dynamic section of the elf. On Linux this is done
691
+ # by default, but is not on dragonfly/openbsd for some reason. Without this
692
+ # $ORIGIN in the runtime path will be undefined and any binaries
693
+ # linked against local libraries will fail to resolve them.
694
+ args.extend(self._apply_prefix('-z,origin'))
695
+
696
+ # In order to avoid relinking for RPATH removal, the binary needs to contain just
697
+ # enough space in the ELF header to hold the final installation RPATH.
698
+ paths = ':'.join(all_paths)
699
+ if len(paths) < len(install_rpath):
700
+ padding = 'X' * (len(install_rpath) - len(paths))
701
+ if not paths:
702
+ paths = padding
703
+ else:
704
+ paths = paths + ':' + padding
705
+ args.extend(self._apply_prefix('-rpath,' + paths))
706
+
707
+ # TODO: should this actually be "for solaris/sunos"?
708
+ if mesonlib.is_sunos():
709
+ return (args, rpath_dirs_to_remove)
710
+
711
+ # Rpaths to use while linking must be absolute. These are not
712
+ # written to the binary. Needed only with GNU ld:
713
+ # https://sourceware.org/bugzilla/show_bug.cgi?id=16936
714
+ # Not needed on Windows or other platforms that don't use RPATH
715
+ # https://github.com/mesonbuild/meson/issues/1897
716
+ #
717
+ # In addition, this linker option tends to be quite long and some
718
+ # compilers have trouble dealing with it. That's why we will include
719
+ # one option per folder, like this:
720
+ #
721
+ # -Wl,-rpath-link,/path/to/folder1 -Wl,-rpath,/path/to/folder2 ...
722
+ #
723
+ # ...instead of just one single looooong option, like this:
724
+ #
725
+ # -Wl,-rpath-link,/path/to/folder1:/path/to/folder2:...
726
+ for p in rpath_paths:
727
+ args.extend(self._apply_prefix('-rpath-link,' + os.path.join(build_dir, p)))
728
+
729
+ return (args, rpath_dirs_to_remove)
730
+
731
+ def get_win_subsystem_args(self, value: str) -> T.List[str]:
732
+ # MinGW only directly supports a couple of the possible
733
+ # PE application types. The raw integer works as an argument
734
+ # as well, and is always accepted, so we manually map the
735
+ # other types here. List of all types:
736
+ # https://github.com/wine-mirror/wine/blob/3ded60bd1654dc689d24a23305f4a93acce3a6f2/include/winnt.h#L2492-L2507
737
+ versionsuffix = None
738
+ if ',' in value:
739
+ value, versionsuffix = value.split(',', 1)
740
+ newvalue = self._SUBSYSTEMS.get(value)
741
+ if newvalue is not None:
742
+ if versionsuffix is not None:
743
+ newvalue += f':{versionsuffix}'
744
+ args = [f'--subsystem,{newvalue}']
745
+ else:
746
+ raise mesonlib.MesonBugException(f'win_subsystem: {value!r} not handled in MinGW linker. This should not be possible.')
747
+
748
+ return self._apply_prefix(args)
749
+
750
+
751
+ class AppleDynamicLinker(PosixDynamicLinkerMixin, DynamicLinker):
752
+
753
+ """Apple's ld implementation."""
754
+
755
+ id = 'ld64'
756
+
757
+ def get_asneeded_args(self) -> T.List[str]:
758
+ return self._apply_prefix('-dead_strip_dylibs')
759
+
760
+ def get_allow_undefined_args(self) -> T.List[str]:
761
+ return self._apply_prefix('-undefined,dynamic_lookup')
762
+
763
+ def get_std_shared_module_args(self, options: 'KeyedOptionDictType') -> T.List[str]:
764
+ return ['-bundle'] + self._apply_prefix('-undefined,dynamic_lookup')
765
+
766
+ def get_pie_args(self) -> T.List[str]:
767
+ return []
768
+
769
+ def get_link_whole_for(self, args: T.List[str]) -> T.List[str]:
770
+ result: T.List[str] = []
771
+ for a in args:
772
+ result.extend(self._apply_prefix('-force_load'))
773
+ result.append(a)
774
+ return result
775
+
776
+ def get_coverage_args(self) -> T.List[str]:
777
+ return ['--coverage']
778
+
779
+ def sanitizer_args(self, value: str) -> T.List[str]:
780
+ if value == 'none':
781
+ return []
782
+ return ['-fsanitize=' + value]
783
+
784
+ def no_undefined_args(self) -> T.List[str]:
785
+ # We used to emit -undefined,error, but starting with Xcode 15 /
786
+ # Sonoma, doing so triggers "ld: warning: -undefined error is
787
+ # deprecated". Given that "-undefined error" is documented to be the
788
+ # linker's default behaviour, this warning seems ill advised. However,
789
+ # it does create a lot of noise. As "-undefined error" is the default
790
+ # behaviour, the least bad way to deal with this seems to be to just
791
+ # not emit anything here. Of course that only works as long as nothing
792
+ # else injects -undefined dynamic_lookup, or such. Complain to Apple.
793
+ return []
794
+
795
+ def headerpad_args(self) -> T.List[str]:
796
+ return self._apply_prefix('-headerpad_max_install_names')
797
+
798
+ def bitcode_args(self) -> T.List[str]:
799
+ return self._apply_prefix('-bitcode_bundle')
800
+
801
+ def fatal_warnings(self) -> T.List[str]:
802
+ return self._apply_prefix('-fatal_warnings')
803
+
804
+ def get_soname_args(self, env: 'Environment', prefix: str, shlib_name: str,
805
+ suffix: str, soversion: str, darwin_versions: T.Tuple[str, str]) -> T.List[str]:
806
+ install_name = ['@rpath/', prefix, shlib_name]
807
+ if soversion is not None:
808
+ install_name.append('.' + soversion)
809
+ install_name.append('.dylib')
810
+ args = ['-install_name', ''.join(install_name)]
811
+ if darwin_versions:
812
+ args.extend(['-compatibility_version', darwin_versions[0],
813
+ '-current_version', darwin_versions[1]])
814
+ return args
815
+
816
+ def build_rpath_args(self, env: 'Environment', build_dir: str, from_dir: str,
817
+ rpath_paths: T.Tuple[str, ...], build_rpath: str,
818
+ install_rpath: str) -> T.Tuple[T.List[str], T.Set[bytes]]:
819
+ if not rpath_paths and not install_rpath and not build_rpath:
820
+ return ([], set())
821
+ args: T.List[str] = []
822
+ # @loader_path is the equivalent of $ORIGIN on macOS
823
+ # https://stackoverflow.com/q/26280738
824
+ origin_placeholder = '@loader_path'
825
+ processed_rpaths = prepare_rpaths(rpath_paths, build_dir, from_dir)
826
+ all_paths = mesonlib.OrderedSet([os.path.join(origin_placeholder, p) for p in processed_rpaths])
827
+ if build_rpath != '':
828
+ all_paths.add(build_rpath)
829
+ for rp in all_paths:
830
+ args.extend(self._apply_prefix('-rpath,' + rp))
831
+
832
+ return (args, set())
833
+
834
+ def get_thinlto_cache_args(self, path: str) -> T.List[str]:
835
+ return ["-Wl,-cache_path_lto," + path]
836
+
837
+
838
+ class LLVMLD64DynamicLinker(AppleDynamicLinker):
839
+
840
+ id = 'ld64.lld'
841
+
842
+
843
+ class GnuDynamicLinker(GnuLikeDynamicLinkerMixin, PosixDynamicLinkerMixin, DynamicLinker):
844
+
845
+ """Representation of GNU ld.bfd and ld.gold."""
846
+
847
+ def get_accepts_rsp(self) -> bool:
848
+ return True
849
+
850
+
851
+ class GnuGoldDynamicLinker(GnuDynamicLinker):
852
+
853
+ id = 'ld.gold'
854
+
855
+ def get_thinlto_cache_args(self, path: str) -> T.List[str]:
856
+ return ['-Wl,-plugin-opt,cache-dir=' + path]
857
+
858
+
859
+ class GnuBFDDynamicLinker(GnuDynamicLinker):
860
+
861
+ id = 'ld.bfd'
862
+
863
+
864
+ class MoldDynamicLinker(GnuDynamicLinker):
865
+
866
+ id = 'ld.mold'
867
+
868
+ def get_thinlto_cache_args(self, path: str) -> T.List[str]:
869
+ return ['-Wl,--thinlto-cache-dir=' + path]
870
+
871
+
872
+ class LLVMDynamicLinker(GnuLikeDynamicLinkerMixin, PosixDynamicLinkerMixin, DynamicLinker):
873
+
874
+ """Representation of LLVM's ld.lld linker.
875
+
876
+ This is only the gnu-like linker, not the apple like or link.exe like
877
+ linkers.
878
+ """
879
+
880
+ id = 'ld.lld'
881
+
882
+ def __init__(self, exelist: T.List[str],
883
+ for_machine: mesonlib.MachineChoice, prefix_arg: T.Union[str, T.List[str]],
884
+ always_args: T.List[str], *, version: str = 'unknown version'):
885
+ super().__init__(exelist, for_machine, prefix_arg, always_args, version=version)
886
+
887
+ # Some targets don't seem to support this argument (windows, wasm, ...)
888
+ _, _, e = mesonlib.Popen_safe(self.exelist + always_args + self._apply_prefix('--allow-shlib-undefined'))
889
+ # Versions < 9 do not have a quoted argument
890
+ self.has_allow_shlib_undefined = ('unknown argument: --allow-shlib-undefined' not in e) and ("unknown argument: '--allow-shlib-undefined'" not in e)
891
+
892
+ def get_allow_undefined_args(self) -> T.List[str]:
893
+ if self.has_allow_shlib_undefined:
894
+ return self._apply_prefix('--allow-shlib-undefined')
895
+ return []
896
+
897
+ def get_thinlto_cache_args(self, path: str) -> T.List[str]:
898
+ return ['-Wl,--thinlto-cache-dir=' + path]
899
+
900
+ def get_win_subsystem_args(self, value: str) -> T.List[str]:
901
+ # lld does not support a numeric subsystem value
902
+ version = None
903
+ if ',' in value:
904
+ value, version = value.split(',', 1)
905
+ if value in self._SUBSYSTEMS:
906
+ if version is not None:
907
+ value += f':{version}'
908
+ return self._apply_prefix([f'--subsystem,{value}'])
909
+ else:
910
+ raise mesonlib.MesonBugException(f'win_subsystem: {value} not handled in lld linker. This should not be possible.')
911
+
912
+
913
+ class WASMDynamicLinker(GnuLikeDynamicLinkerMixin, PosixDynamicLinkerMixin, DynamicLinker):
914
+
915
+ """Emscripten's wasm-ld."""
916
+
917
+ id = 'ld.wasm'
918
+
919
+ def get_allow_undefined_args(self) -> T.List[str]:
920
+ return ['-sERROR_ON_UNDEFINED_SYMBOLS=0']
921
+
922
+ def no_undefined_args(self) -> T.List[str]:
923
+ return ['-sERROR_ON_UNDEFINED_SYMBOLS=1']
924
+
925
+ def get_soname_args(self, env: 'Environment', prefix: str, shlib_name: str,
926
+ suffix: str, soversion: str, darwin_versions: T.Tuple[str, str]) -> T.List[str]:
927
+ raise MesonException(f'{self.id} does not support shared libraries.')
928
+
929
+ def get_asneeded_args(self) -> T.List[str]:
930
+ return []
931
+
932
+ def build_rpath_args(self, env: 'Environment', build_dir: str, from_dir: str,
933
+ rpath_paths: T.Tuple[str, ...], build_rpath: str,
934
+ install_rpath: str) -> T.Tuple[T.List[str], T.Set[bytes]]:
935
+ return ([], set())
936
+
937
+
938
+ class CcrxDynamicLinker(DynamicLinker):
939
+
940
+ """Linker for Renesas CCrx compiler."""
941
+
942
+ id = 'rlink'
943
+
944
+ def __init__(self, for_machine: mesonlib.MachineChoice,
945
+ *, version: str = 'unknown version'):
946
+ super().__init__(['rlink.exe'], for_machine, '', [],
947
+ version=version)
948
+
949
+ def get_accepts_rsp(self) -> bool:
950
+ return False
951
+
952
+ def get_lib_prefix(self) -> str:
953
+ return '-lib='
954
+
955
+ def get_std_shared_lib_args(self) -> T.List[str]:
956
+ return []
957
+
958
+ def get_output_args(self, outputname: str) -> T.List[str]:
959
+ return [f'-output={outputname}']
960
+
961
+ def get_search_args(self, dirname: str) -> 'T.NoReturn':
962
+ raise OSError('rlink.exe does not have a search dir argument')
963
+
964
+ def get_allow_undefined_args(self) -> T.List[str]:
965
+ return []
966
+
967
+ def get_soname_args(self, env: 'Environment', prefix: str, shlib_name: str,
968
+ suffix: str, soversion: str, darwin_versions: T.Tuple[str, str]) -> T.List[str]:
969
+ return []
970
+
971
+
972
+ class Xc16DynamicLinker(DynamicLinker):
973
+
974
+ """Linker for Microchip XC16 compiler."""
975
+
976
+ id = 'xc16-gcc'
977
+
978
+ def __init__(self, for_machine: mesonlib.MachineChoice,
979
+ *, version: str = 'unknown version'):
980
+ super().__init__(['xc16-gcc'], for_machine, '', [],
981
+ version=version)
982
+
983
+ def get_link_whole_for(self, args: T.List[str]) -> T.List[str]:
984
+ if len(args) < 2:
985
+ return args
986
+ return self._apply_prefix('--start-group') + args + self._apply_prefix('--end-group')
987
+
988
+ def get_accepts_rsp(self) -> bool:
989
+ return False
990
+
991
+ def get_lib_prefix(self) -> str:
992
+ return ''
993
+
994
+ def get_std_shared_lib_args(self) -> T.List[str]:
995
+ return []
996
+
997
+ def get_output_args(self, outputname: str) -> T.List[str]:
998
+ return [f'-o{outputname}']
999
+
1000
+ def get_search_args(self, dirname: str) -> 'T.NoReturn':
1001
+ raise OSError('xc16-gcc does not have a search dir argument')
1002
+
1003
+ def get_allow_undefined_args(self) -> T.List[str]:
1004
+ return []
1005
+
1006
+ def get_soname_args(self, env: 'Environment', prefix: str, shlib_name: str,
1007
+ suffix: str, soversion: str, darwin_versions: T.Tuple[str, str]) -> T.List[str]:
1008
+ return []
1009
+
1010
+ def build_rpath_args(self, env: 'Environment', build_dir: str, from_dir: str,
1011
+ rpath_paths: T.Tuple[str, ...], build_rpath: str,
1012
+ install_rpath: str) -> T.Tuple[T.List[str], T.Set[bytes]]:
1013
+ return ([], set())
1014
+
1015
+ class CompCertDynamicLinker(DynamicLinker):
1016
+
1017
+ """Linker for CompCert C compiler."""
1018
+
1019
+ id = 'ccomp'
1020
+
1021
+ def __init__(self, for_machine: mesonlib.MachineChoice,
1022
+ *, version: str = 'unknown version'):
1023
+ super().__init__(['ccomp'], for_machine, '', [],
1024
+ version=version)
1025
+
1026
+ def get_link_whole_for(self, args: T.List[str]) -> T.List[str]:
1027
+ if not args:
1028
+ return args
1029
+ return self._apply_prefix('-Wl,--whole-archive') + args + self._apply_prefix('-Wl,--no-whole-archive')
1030
+
1031
+ def get_accepts_rsp(self) -> bool:
1032
+ return False
1033
+
1034
+ def get_lib_prefix(self) -> str:
1035
+ return ''
1036
+
1037
+ def get_std_shared_lib_args(self) -> T.List[str]:
1038
+ return []
1039
+
1040
+ def get_output_args(self, outputname: str) -> T.List[str]:
1041
+ return [f'-o{outputname}']
1042
+
1043
+ def get_search_args(self, dirname: str) -> T.List[str]:
1044
+ return [f'-L{dirname}']
1045
+
1046
+ def get_allow_undefined_args(self) -> T.List[str]:
1047
+ return []
1048
+
1049
+ def get_soname_args(self, env: 'Environment', prefix: str, shlib_name: str,
1050
+ suffix: str, soversion: str, darwin_versions: T.Tuple[str, str]) -> T.List[str]:
1051
+ raise MesonException(f'{self.id} does not support shared libraries.')
1052
+
1053
+ def build_rpath_args(self, env: 'Environment', build_dir: str, from_dir: str,
1054
+ rpath_paths: T.Tuple[str, ...], build_rpath: str,
1055
+ install_rpath: str) -> T.Tuple[T.List[str], T.Set[bytes]]:
1056
+ return ([], set())
1057
+
1058
+ class TIDynamicLinker(DynamicLinker):
1059
+
1060
+ """Linker for Texas Instruments compiler family."""
1061
+
1062
+ id = 'ti'
1063
+
1064
+ def __init__(self, exelist: T.List[str], for_machine: mesonlib.MachineChoice,
1065
+ *, version: str = 'unknown version'):
1066
+ super().__init__(exelist, for_machine, '', [],
1067
+ version=version)
1068
+
1069
+ def get_link_whole_for(self, args: T.List[str]) -> T.List[str]:
1070
+ if len(args) < 2:
1071
+ return args
1072
+ return self._apply_prefix('--start-group') + args + self._apply_prefix('--end-group')
1073
+
1074
+ def get_accepts_rsp(self) -> bool:
1075
+ return False
1076
+
1077
+ def get_lib_prefix(self) -> str:
1078
+ return '-l='
1079
+
1080
+ def get_std_shared_lib_args(self) -> T.List[str]:
1081
+ return []
1082
+
1083
+ def get_output_args(self, outputname: str) -> T.List[str]:
1084
+ return ['-z', f'--output_file={outputname}']
1085
+
1086
+ def get_search_args(self, dirname: str) -> 'T.NoReturn':
1087
+ raise OSError('TI compilers do not have a search dir argument')
1088
+
1089
+ def get_allow_undefined_args(self) -> T.List[str]:
1090
+ return []
1091
+
1092
+ def get_always_args(self) -> T.List[str]:
1093
+ return []
1094
+
1095
+
1096
+ class C2000DynamicLinker(TIDynamicLinker):
1097
+ # Required for backwards compat with projects created before ti-cgt support existed
1098
+ id = 'cl2000'
1099
+
1100
+ class C6000DynamicLinker(TIDynamicLinker):
1101
+ id = 'cl6000'
1102
+
1103
+
1104
+ class ArmDynamicLinker(PosixDynamicLinkerMixin, DynamicLinker):
1105
+
1106
+ """Linker for the ARM compiler."""
1107
+
1108
+ id = 'armlink'
1109
+
1110
+ def __init__(self, for_machine: mesonlib.MachineChoice,
1111
+ *, version: str = 'unknown version'):
1112
+ super().__init__(['armlink'], for_machine, '', [],
1113
+ version=version)
1114
+
1115
+ def get_accepts_rsp(self) -> bool:
1116
+ return False
1117
+
1118
+ def get_std_shared_lib_args(self) -> 'T.NoReturn':
1119
+ raise MesonException('The Arm Linkers do not support shared libraries')
1120
+
1121
+ def get_allow_undefined_args(self) -> T.List[str]:
1122
+ return []
1123
+
1124
+
1125
+ class ArmClangDynamicLinker(ArmDynamicLinker):
1126
+
1127
+ """Linker used with ARM's clang fork.
1128
+
1129
+ The interface is similar enough to the old ARM ld that it inherits and
1130
+ extends a few things as needed.
1131
+ """
1132
+
1133
+ def export_dynamic_args(self, env: 'Environment') -> T.List[str]:
1134
+ return ['--export_dynamic']
1135
+
1136
+ def import_library_args(self, implibname: str) -> T.List[str]:
1137
+ return ['--symdefs=' + implibname]
1138
+
1139
+ class QualcommLLVMDynamicLinker(LLVMDynamicLinker):
1140
+
1141
+ """ARM Linker from Snapdragon LLVM ARM Compiler."""
1142
+
1143
+ id = 'ld.qcld'
1144
+
1145
+
1146
+ class NAGDynamicLinker(PosixDynamicLinkerMixin, DynamicLinker):
1147
+
1148
+ """NAG Fortran linker, ld via gcc indirection.
1149
+
1150
+ Using nagfor -Wl,foo passes option foo to a backend gcc invocation.
1151
+ (This linking gathers the correct objects needed from the nagfor runtime
1152
+ system.)
1153
+ To pass gcc -Wl,foo options (i.e., to ld) one must apply indirection
1154
+ again: nagfor -Wl,-Wl,,foo
1155
+ """
1156
+
1157
+ id = 'nag'
1158
+
1159
+ def build_rpath_args(self, env: 'Environment', build_dir: str, from_dir: str,
1160
+ rpath_paths: T.Tuple[str, ...], build_rpath: str,
1161
+ install_rpath: str) -> T.Tuple[T.List[str], T.Set[bytes]]:
1162
+ if not rpath_paths and not install_rpath and not build_rpath:
1163
+ return ([], set())
1164
+ args: T.List[str] = []
1165
+ origin_placeholder = '$ORIGIN'
1166
+ processed_rpaths = prepare_rpaths(rpath_paths, build_dir, from_dir)
1167
+ all_paths = mesonlib.OrderedSet([os.path.join(origin_placeholder, p) for p in processed_rpaths])
1168
+ if build_rpath != '':
1169
+ all_paths.add(build_rpath)
1170
+ for rp in all_paths:
1171
+ args.extend(self._apply_prefix('-Wl,-Wl,,-rpath,,' + rp))
1172
+
1173
+ return (args, set())
1174
+
1175
+ def get_allow_undefined_args(self) -> T.List[str]:
1176
+ return []
1177
+
1178
+ def get_std_shared_lib_args(self) -> T.List[str]:
1179
+ from ..compilers.fortran import NAGFortranCompiler
1180
+ return NAGFortranCompiler.get_nagfor_quiet(self.version) + ['-Wl,-shared']
1181
+
1182
+
1183
+ class PGIDynamicLinker(PosixDynamicLinkerMixin, DynamicLinker):
1184
+
1185
+ """PGI linker."""
1186
+
1187
+ id = 'pgi'
1188
+
1189
+ def get_allow_undefined_args(self) -> T.List[str]:
1190
+ return []
1191
+
1192
+ def get_soname_args(self, env: 'Environment', prefix: str, shlib_name: str,
1193
+ suffix: str, soversion: str, darwin_versions: T.Tuple[str, str]) -> T.List[str]:
1194
+ return []
1195
+
1196
+ def get_std_shared_lib_args(self) -> T.List[str]:
1197
+ # PGI -shared is Linux only.
1198
+ if mesonlib.is_windows():
1199
+ return ['-Bdynamic', '-Mmakedll']
1200
+ elif mesonlib.is_linux():
1201
+ return ['-shared']
1202
+ return []
1203
+
1204
+ def build_rpath_args(self, env: 'Environment', build_dir: str, from_dir: str,
1205
+ rpath_paths: T.Tuple[str, ...], build_rpath: str,
1206
+ install_rpath: str) -> T.Tuple[T.List[str], T.Set[bytes]]:
1207
+ if not env.machines[self.for_machine].is_windows():
1208
+ return (['-R' + os.path.join(build_dir, p) for p in rpath_paths], set())
1209
+ return ([], set())
1210
+
1211
+ NvidiaHPC_DynamicLinker = PGIDynamicLinker
1212
+
1213
+
1214
+ class PGIStaticLinker(StaticLinker):
1215
+ def __init__(self, exelist: T.List[str]):
1216
+ super().__init__(exelist)
1217
+ self.id = 'ar'
1218
+ self.std_args = ['-r']
1219
+
1220
+ def get_std_link_args(self, env: 'Environment', is_thin: bool) -> T.List[str]:
1221
+ return self.std_args
1222
+
1223
+ def get_output_args(self, target: str) -> T.List[str]:
1224
+ return [target]
1225
+
1226
+ NvidiaHPC_StaticLinker = PGIStaticLinker
1227
+
1228
+
1229
+ class VisualStudioLikeLinkerMixin(DynamicLinkerBase):
1230
+
1231
+ """Mixin class for dynamic linkers that act like Microsoft's link.exe."""
1232
+
1233
+ if T.TYPE_CHECKING:
1234
+ for_machine = MachineChoice.HOST
1235
+ def _apply_prefix(self, arg: T.Union[str, T.List[str]]) -> T.List[str]: ...
1236
+
1237
+ _OPTIMIZATION_ARGS: T.Dict[str, T.List[str]] = {
1238
+ 'plain': [],
1239
+ '0': [],
1240
+ 'g': [],
1241
+ '1': [],
1242
+ '2': [],
1243
+ # The otherwise implicit REF and ICF linker optimisations are disabled by
1244
+ # /DEBUG. REF implies ICF.
1245
+ '3': ['/OPT:REF'],
1246
+ 's': ['/INCREMENTAL:NO', '/OPT:REF'],
1247
+ }
1248
+
1249
+ def __init__(self, exelist: T.List[str], for_machine: mesonlib.MachineChoice,
1250
+ prefix_arg: T.Union[str, T.List[str]], always_args: T.List[str], *,
1251
+ version: str = 'unknown version', direct: bool = True, machine: str = 'x86'):
1252
+ # There's no way I can find to make mypy understand what's going on here
1253
+ super().__init__(exelist, for_machine, prefix_arg, always_args, version=version)
1254
+ self.machine = machine
1255
+ self.direct = direct
1256
+
1257
+ def invoked_by_compiler(self) -> bool:
1258
+ return not self.direct
1259
+
1260
+ def get_output_args(self, outputname: str) -> T.List[str]:
1261
+ return self._apply_prefix(['/MACHINE:' + self.machine, '/OUT:' + outputname])
1262
+
1263
+ def get_always_args(self) -> T.List[str]:
1264
+ parent = super().get_always_args()
1265
+ return self._apply_prefix('/nologo') + parent
1266
+
1267
+ def get_search_args(self, dirname: str) -> T.List[str]:
1268
+ return self._apply_prefix('/LIBPATH:' + dirname)
1269
+
1270
+ def get_std_shared_lib_args(self) -> T.List[str]:
1271
+ return self._apply_prefix('/DLL')
1272
+
1273
+ def get_debugfile_name(self, targetfile: str) -> str:
1274
+ return targetfile
1275
+
1276
+ def get_debugfile_args(self, targetfile: str) -> T.List[str]:
1277
+ return self._apply_prefix(['/DEBUG', '/PDB:' + self.get_debugfile_name(targetfile)])
1278
+
1279
+ def get_link_whole_for(self, args: T.List[str]) -> T.List[str]:
1280
+ # Only since VS2015
1281
+ args = mesonlib.listify(args)
1282
+ l: T.List[str] = []
1283
+ for a in args:
1284
+ l.extend(self._apply_prefix('/WHOLEARCHIVE:' + a))
1285
+ return l
1286
+
1287
+ def get_allow_undefined_args(self) -> T.List[str]:
1288
+ return []
1289
+
1290
+ def get_soname_args(self, env: 'Environment', prefix: str, shlib_name: str,
1291
+ suffix: str, soversion: str, darwin_versions: T.Tuple[str, str]) -> T.List[str]:
1292
+ return []
1293
+
1294
+ def import_library_args(self, implibname: str) -> T.List[str]:
1295
+ """The command to generate the import library."""
1296
+ return self._apply_prefix(['/IMPLIB:' + implibname])
1297
+
1298
+ def rsp_file_syntax(self) -> RSPFileSyntax:
1299
+ return RSPFileSyntax.MSVC
1300
+
1301
+
1302
+ class MSVCDynamicLinker(VisualStudioLikeLinkerMixin, DynamicLinker):
1303
+
1304
+ """Microsoft's Link.exe."""
1305
+
1306
+ id = 'link'
1307
+
1308
+ def __init__(self, for_machine: mesonlib.MachineChoice, always_args: T.List[str], *,
1309
+ exelist: T.Optional[T.List[str]] = None,
1310
+ prefix: T.Union[str, T.List[str]] = '',
1311
+ machine: str = 'x86', version: str = 'unknown version',
1312
+ direct: bool = True):
1313
+ super().__init__(exelist or ['link.exe'], for_machine,
1314
+ prefix, always_args, machine=machine, version=version, direct=direct)
1315
+
1316
+ def get_always_args(self) -> T.List[str]:
1317
+ return self._apply_prefix(['/release']) + super().get_always_args()
1318
+
1319
+ def get_win_subsystem_args(self, value: str) -> T.List[str]:
1320
+ return self._apply_prefix([f'/SUBSYSTEM:{value.upper()}'])
1321
+
1322
+
1323
+ class ClangClDynamicLinker(VisualStudioLikeLinkerMixin, DynamicLinker):
1324
+
1325
+ """Clang's lld-link.exe."""
1326
+
1327
+ id = 'lld-link'
1328
+
1329
+ def __init__(self, for_machine: mesonlib.MachineChoice, always_args: T.List[str], *,
1330
+ exelist: T.Optional[T.List[str]] = None,
1331
+ prefix: T.Union[str, T.List[str]] = '',
1332
+ machine: str = 'x86', version: str = 'unknown version',
1333
+ direct: bool = True):
1334
+ super().__init__(exelist or ['lld-link.exe'], for_machine,
1335
+ prefix, always_args, machine=machine, version=version, direct=direct)
1336
+
1337
+ def get_output_args(self, outputname: str) -> T.List[str]:
1338
+ # If we're being driven indirectly by clang just skip /MACHINE
1339
+ # as clang's target triple will handle the machine selection
1340
+ if self.machine is None:
1341
+ return self._apply_prefix([f"/OUT:{outputname}"])
1342
+
1343
+ return super().get_output_args(outputname)
1344
+
1345
+ def get_win_subsystem_args(self, value: str) -> T.List[str]:
1346
+ return self._apply_prefix([f'/SUBSYSTEM:{value.upper()}'])
1347
+
1348
+ def get_thinlto_cache_args(self, path: str) -> T.List[str]:
1349
+ return ["/lldltocache:" + path]
1350
+
1351
+
1352
+ class XilinkDynamicLinker(VisualStudioLikeLinkerMixin, DynamicLinker):
1353
+
1354
+ """Intel's Xilink.exe."""
1355
+
1356
+ id = 'xilink'
1357
+
1358
+ def __init__(self, for_machine: mesonlib.MachineChoice, always_args: T.List[str], *,
1359
+ exelist: T.Optional[T.List[str]] = None,
1360
+ prefix: T.Union[str, T.List[str]] = '',
1361
+ machine: str = 'x86', version: str = 'unknown version',
1362
+ direct: bool = True):
1363
+ super().__init__(['xilink.exe'], for_machine, '', always_args, version=version)
1364
+
1365
+ def get_win_subsystem_args(self, value: str) -> T.List[str]:
1366
+ return self._apply_prefix([f'/SUBSYSTEM:{value.upper()}'])
1367
+
1368
+
1369
+ class SolarisDynamicLinker(PosixDynamicLinkerMixin, DynamicLinker):
1370
+
1371
+ """Sys-V derived linker used on Solaris and OpenSolaris."""
1372
+
1373
+ id = 'ld.solaris'
1374
+
1375
+ def get_link_whole_for(self, args: T.List[str]) -> T.List[str]:
1376
+ if not args:
1377
+ return args
1378
+ return self._apply_prefix('--whole-archive') + args + self._apply_prefix('--no-whole-archive')
1379
+
1380
+ def get_pie_args(self) -> T.List[str]:
1381
+ # Available in Solaris 11.2 and later
1382
+ pc, stdo, stde = mesonlib.Popen_safe(self.exelist + self._apply_prefix('-zhelp'))
1383
+ for line in (stdo + stde).split('\n'):
1384
+ if '-z type' in line:
1385
+ if 'pie' in line:
1386
+ return ['-z', 'type=pie']
1387
+ break
1388
+ return []
1389
+
1390
+ def get_asneeded_args(self) -> T.List[str]:
1391
+ return self._apply_prefix(['-z', 'ignore'])
1392
+
1393
+ def no_undefined_args(self) -> T.List[str]:
1394
+ return ['-z', 'defs']
1395
+
1396
+ def get_allow_undefined_args(self) -> T.List[str]:
1397
+ return ['-z', 'nodefs']
1398
+
1399
+ def fatal_warnings(self) -> T.List[str]:
1400
+ return ['-z', 'fatal-warnings']
1401
+
1402
+ def build_rpath_args(self, env: 'Environment', build_dir: str, from_dir: str,
1403
+ rpath_paths: T.Tuple[str, ...], build_rpath: str,
1404
+ install_rpath: str) -> T.Tuple[T.List[str], T.Set[bytes]]:
1405
+ if not rpath_paths and not install_rpath and not build_rpath:
1406
+ return ([], set())
1407
+ processed_rpaths = prepare_rpaths(rpath_paths, build_dir, from_dir)
1408
+ all_paths = mesonlib.OrderedSet([os.path.join('$ORIGIN', p) for p in processed_rpaths])
1409
+ rpath_dirs_to_remove: T.Set[bytes] = set()
1410
+ for p in all_paths:
1411
+ rpath_dirs_to_remove.add(p.encode('utf8'))
1412
+ if build_rpath != '':
1413
+ all_paths.add(build_rpath)
1414
+ for p in build_rpath.split(':'):
1415
+ rpath_dirs_to_remove.add(p.encode('utf8'))
1416
+
1417
+ # In order to avoid relinking for RPATH removal, the binary needs to contain just
1418
+ # enough space in the ELF header to hold the final installation RPATH.
1419
+ paths = ':'.join(all_paths)
1420
+ if len(paths) < len(install_rpath):
1421
+ padding = 'X' * (len(install_rpath) - len(paths))
1422
+ if not paths:
1423
+ paths = padding
1424
+ else:
1425
+ paths = paths + ':' + padding
1426
+ return (self._apply_prefix(f'-rpath,{paths}'), rpath_dirs_to_remove)
1427
+
1428
+ def get_soname_args(self, env: 'Environment', prefix: str, shlib_name: str,
1429
+ suffix: str, soversion: str, darwin_versions: T.Tuple[str, str]) -> T.List[str]:
1430
+ sostr = '' if soversion is None else '.' + soversion
1431
+ return self._apply_prefix(f'-soname,{prefix}{shlib_name}.{suffix}{sostr}')
1432
+
1433
+
1434
+ class AIXDynamicLinker(PosixDynamicLinkerMixin, DynamicLinker):
1435
+
1436
+ """Sys-V derived linker used on AIX"""
1437
+
1438
+ id = 'ld.aix'
1439
+
1440
+ def get_always_args(self) -> T.List[str]:
1441
+ return self._apply_prefix(['-bnoipath', '-bbigtoc']) + super().get_always_args()
1442
+
1443
+ def no_undefined_args(self) -> T.List[str]:
1444
+ return self._apply_prefix(['-bernotok'])
1445
+
1446
+ def get_allow_undefined_args(self) -> T.List[str]:
1447
+ return self._apply_prefix(['-berok'])
1448
+
1449
+ def get_archive_name(self, filename: str) -> str:
1450
+ # In AIX we allow the shared library name to have the lt_version and so_version.
1451
+ # But the archive name must just be .a .
1452
+ # For Example shared object can have the name libgio.so.0.7200.1 but the archive
1453
+ # must have the name libgio.a having libgio.a (libgio.so.0.7200.1) in the
1454
+ # archive. This regular expression is to do the same.
1455
+ filename = re.sub('[.][a]([.]?([0-9]+))*([.]?([a-z]+))*', '.a', filename.replace('.so', '.a'))
1456
+ return filename
1457
+
1458
+ def get_command_to_archive_shlib(self) -> T.List[str]:
1459
+ # Archive shared library object and remove the shared library object,
1460
+ # since it already exists in the archive.
1461
+ command = ['ar', '-q', '-v', '$out', '$in', '&&', 'rm', '-f', '$in']
1462
+ return command
1463
+
1464
+ def get_link_whole_for(self, args: T.List[str]) -> T.List[str]:
1465
+ # AIX's linker always links the whole archive: "The ld command
1466
+ # processes all input files in the same manner, whether they are
1467
+ # archives or not."
1468
+ return args
1469
+
1470
+ def build_rpath_args(self, env: 'Environment', build_dir: str, from_dir: str,
1471
+ rpath_paths: T.Tuple[str, ...], build_rpath: str,
1472
+ install_rpath: str) -> T.Tuple[T.List[str], T.Set[bytes]]:
1473
+ all_paths: mesonlib.OrderedSet[str] = mesonlib.OrderedSet()
1474
+ # install_rpath first, followed by other paths, and the system path last
1475
+ if install_rpath != '':
1476
+ all_paths.add(install_rpath)
1477
+ if build_rpath != '':
1478
+ all_paths.add(build_rpath)
1479
+ for p in rpath_paths:
1480
+ all_paths.add(os.path.join(build_dir, p))
1481
+ # We should consider allowing the $LIBPATH environment variable
1482
+ # to override sys_path.
1483
+ sys_path = env.get_compiler_system_lib_dirs(self.for_machine)
1484
+ if len(sys_path) == 0:
1485
+ # get_compiler_system_lib_dirs doesn't support our compiler.
1486
+ # Use the default system library path
1487
+ all_paths.update(['/usr/lib', '/lib'])
1488
+ else:
1489
+ # Include the compiler's default library paths, but filter out paths that don't exist
1490
+ for p in sys_path:
1491
+ if os.path.isdir(p):
1492
+ all_paths.add(p)
1493
+ return (self._apply_prefix('-blibpath:' + ':'.join(all_paths)), set())
1494
+
1495
+ def thread_flags(self, env: 'Environment') -> T.List[str]:
1496
+ return ['-pthread']
1497
+
1498
+
1499
+ class OptlinkDynamicLinker(VisualStudioLikeLinkerMixin, DynamicLinker):
1500
+
1501
+ """Digital Mars dynamic linker for windows."""
1502
+
1503
+ id = 'optlink'
1504
+
1505
+ def __init__(self, exelist: T.List[str], for_machine: mesonlib.MachineChoice,
1506
+ *, version: str = 'unknown version'):
1507
+ # Use optlink instead of link so we don't interfere with other link.exe
1508
+ # implementations.
1509
+ super().__init__(exelist, for_machine, '', [], version=version)
1510
+
1511
+ def get_allow_undefined_args(self) -> T.List[str]:
1512
+ return []
1513
+
1514
+ def get_debugfile_args(self, targetfile: str) -> T.List[str]:
1515
+ # Optlink does not generate pdb files.
1516
+ return []
1517
+
1518
+ def get_always_args(self) -> T.List[str]:
1519
+ return []
1520
+
1521
+
1522
+ class CudaLinker(PosixDynamicLinkerMixin, DynamicLinker):
1523
+ """Cuda linker (nvlink)"""
1524
+
1525
+ id = 'nvlink'
1526
+
1527
+ @staticmethod
1528
+ def parse_version() -> str:
1529
+ version_cmd = ['nvlink', '--version']
1530
+ try:
1531
+ _, out, _ = mesonlib.Popen_safe(version_cmd)
1532
+ except OSError:
1533
+ return 'unknown version'
1534
+ # Output example:
1535
+ # nvlink: NVIDIA (R) Cuda linker
1536
+ # Copyright (c) 2005-2018 NVIDIA Corporation
1537
+ # Built on Sun_Sep_30_21:09:22_CDT_2018
1538
+ # Cuda compilation tools, release 10.0, V10.0.166
1539
+ # we need the most verbose version output. Luckily starting with V
1540
+ return out.strip().rsplit('V', maxsplit=1)[-1]
1541
+
1542
+ def get_accepts_rsp(self) -> bool:
1543
+ # nvcc does not support response files
1544
+ return False
1545
+
1546
+ def get_lib_prefix(self) -> str:
1547
+ # nvcc doesn't recognize Meson's default .a extension for static libraries on
1548
+ # Windows and passes it to cl as an object file, resulting in 'warning D9024 :
1549
+ # unrecognized source file type 'xxx.a', object file assumed'.
1550
+ #
1551
+ # nvcc's --library= option doesn't help: it takes the library name without the
1552
+ # extension and assumes that the extension on Windows is .lib; prefixing the
1553
+ # library with -Xlinker= seems to work.
1554
+ #
1555
+ # On Linux, we have to use rely on -Xlinker= too, since nvcc/nvlink chokes on
1556
+ # versioned shared libraries:
1557
+ #
1558
+ # nvcc fatal : Don't know what to do with 'subprojects/foo/libbar.so.0.1.2'
1559
+ #
1560
+ from ..compilers.cuda import CudaCompiler
1561
+ return CudaCompiler.LINKER_PREFIX
1562
+
1563
+ def fatal_warnings(self) -> T.List[str]:
1564
+ return ['--warning-as-error']
1565
+
1566
+ def get_allow_undefined_args(self) -> T.List[str]:
1567
+ return []
1568
+
1569
+ def get_soname_args(self, env: 'Environment', prefix: str, shlib_name: str,
1570
+ suffix: str, soversion: str, darwin_versions: T.Tuple[str, str]) -> T.List[str]:
1571
+ return []
1572
+
1573
+
1574
+ class MetrowerksLinker(DynamicLinker):
1575
+
1576
+ def __init__(self, exelist: T.List[str], for_machine: mesonlib.MachineChoice,
1577
+ *, version: str = 'unknown version'):
1578
+ super().__init__(exelist, for_machine, '', [],
1579
+ version=version)
1580
+
1581
+ def fatal_warnings(self) -> T.List[str]:
1582
+ return ['-w', 'error']
1583
+
1584
+ def get_allow_undefined_args(self) -> T.List[str]:
1585
+ return []
1586
+
1587
+ def get_accepts_rsp(self) -> bool:
1588
+ return True
1589
+
1590
+ def get_lib_prefix(self) -> str:
1591
+ return ""
1592
+
1593
+ def get_linker_always_args(self) -> T.List[str]:
1594
+ return []
1595
+
1596
+ def get_output_args(self, outputname: str) -> T.List[str]:
1597
+ return ['-o', outputname]
1598
+
1599
+ def get_search_args(self, dirname: str) -> T.List[str]:
1600
+ return self._apply_prefix('-L' + dirname)
1601
+
1602
+ def invoked_by_compiler(self) -> bool:
1603
+ return False
1604
+
1605
+ def rsp_file_syntax(self) -> RSPFileSyntax:
1606
+ return RSPFileSyntax.GCC
1607
+
1608
+
1609
+ class MetrowerksLinkerARM(MetrowerksLinker):
1610
+ id = 'mwldarm'
1611
+
1612
+
1613
+ class MetrowerksLinkerEmbeddedPowerPC(MetrowerksLinker):
1614
+ id = 'mwldeppc'