From 88eb952563c2a4d6a511edc61e0f1f16fe118fdd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20K=C3=B6ppe?= Date: Thu, 14 Jan 2021 12:18:03 +0000 Subject: [PATCH] [dso_demo] Add some non-trivial constructions (e.g. using TLS) The use of TLS from DSOs presents particularly interesting technical challenges. The use of TLS in general triggers a certain problem in Bazel on MacOS at this point, which can be avoided by compiling with --dynamic_mode=off or by disabling the dynamic mode feature entirely (see https://github.com/bazelbuild/bazel/issues/4341#issuecomment-758028203). --- sandbox/BUILD | 4 ++++ sandbox/dso_demo.cc | 22 ++++++++++++++++++++-- sandbox/dso_loader.cc | 5 +++-- 3 files changed, 27 insertions(+), 4 deletions(-) diff --git a/sandbox/BUILD b/sandbox/BUILD index f97ec81..b0ba8fd 100644 --- a/sandbox/BUILD +++ b/sandbox/BUILD @@ -25,4 +25,8 @@ cc_binary( srcs = ["dso_demo.cc"], linkshared = 1, linkstatic = 1, + deps = [ + "@com_google_absl//absl/container:flat_hash_map", + "@com_google_absl//absl/strings", + ], ) diff --git a/sandbox/dso_demo.cc b/sandbox/dso_demo.cc index e43ee29..5897704 100644 --- a/sandbox/dso_demo.cc +++ b/sandbox/dso_demo.cc @@ -1,5 +1,23 @@ #include +#include +#include +#include -extern "C" void demo_function() { - std::puts("I am a function."); +#include "absl/strings/string_view.h" +#include "absl/container/flat_hash_map.h" + +extern "C" void demo_function(std::size_t n, const char* args[]) { + std::puts("I am a function. Here come my arguments."); + + absl::flat_hash_map> m; + + for (std::size_t i = 0; i != n; ++i) { + absl::string_view arg = args[i]; + m[arg].emplace_back().assign(arg); + } + + for (const auto& [k, v] : m) { + std::printf("Argument '%*s' appears %zu times.\n", + static_cast(k.size()), k.data(), v.size()); + } } diff --git a/sandbox/dso_loader.cc b/sandbox/dso_loader.cc index 56787bb..af67d29 100644 --- a/sandbox/dso_loader.cc +++ b/sandbox/dso_loader.cc @@ -1,10 +1,11 @@ #include #include +#include #include extern "C" { -using FunPtr = void(); +using FunPtr = void(std::size_t, const char*[]); } // extern "C" int main(int argc, char* argv[]) { @@ -23,7 +24,7 @@ int main(int argc, char* argv[]) { } else { FunPtr* f; *reinterpret_cast(&f) = s; - f(); + f(argc, const_cast(argv)); } if (dlclose(h) != 0) {