Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(218)

Side by Side Diff: tests/pnacl_dynamic_loading/pll_loader_test.cc

Issue 1832623002: PNaCl Dynamic Linking: Using unordered_set to disallow duplicate modules. (Closed) Base URL: https://chromium.googlesource.com/native_client/src/native_client.git@master
Patch Set: Code review Created 4 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « tests/pnacl_dynamic_loading/nacl.scons ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2016 The Native Client Authors. All rights reserved. 1 // Copyright 2016 The Native Client Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "native_client/src/include/nacl_assert.h" 5 #include "native_client/src/include/nacl_assert.h"
6 #include "native_client/src/untrusted/pll_loader/pll_loader.h" 6 #include "native_client/src/untrusted/pll_loader/pll_loader.h"
7 7
8 8
9 namespace { 9 namespace {
10 10
11 template <typename VarType> 11 template <typename VarType>
12 void CheckTlsVar(ModuleSet *modset, const char *name_of_getter, 12 void CheckTlsVar(ModuleSet *modset, const char *name_of_getter,
13 int alignment, VarType expected_value) { 13 int alignment, VarType expected_value) {
14 auto getter = (VarType *(*)()) (uintptr_t) modset->GetSym(name_of_getter); 14 auto getter = (VarType *(*)()) (uintptr_t) modset->GetSym(name_of_getter);
15 ASSERT_NE(getter, NULL); 15 ASSERT_NE(getter, NULL);
16 VarType *var_ptr = getter(); 16 VarType *var_ptr = getter();
17 ASSERT_NE(var_ptr, NULL); 17 ASSERT_NE(var_ptr, NULL);
18 ASSERT_EQ((uintptr_t) var_ptr & (alignment - 1), 0); 18 ASSERT_EQ((uintptr_t) var_ptr & (alignment - 1), 0);
19 ASSERT_EQ(*var_ptr, expected_value); 19 ASSERT_EQ(*var_ptr, expected_value);
20 } 20 }
21 21
22 } // namespace 22 } // namespace
23 23
24 int main(int argc, char **argv) { 24 int main(int argc, char **argv) {
25 if (argc != 4) { 25 if (argc != 5) {
26 fprintf(stderr, "Usage: pll_loader_test <3 ELF files>\n"); 26 fprintf(stderr, "Usage: pll_loader_test <Directory path> <3 ELF files>\n");
27 return 1; 27 return 1;
28 } 28 }
29 29
30 const char *module_a_filename = argv[1]; 30 const char *module_directory = argv[1];
31 const char *module_b_filename = argv[2]; 31 const char *module_a_soname = argv[2];
32 const char *module_tls_filename = argv[3]; 32 const char *module_b_soname = argv[3];
33 const char *module_tls_soname = argv[4];
33 34
34 ModuleSet modset; 35 ModuleSet modset;
36 std::vector<std::string> search_path;
37 search_path.push_back(module_directory);
38 modset.SetSonameSearchPath(search_path);
35 39
36 // "module_a_var" should only be resolvable after we load module A. 40 // "module_a_var" should only be resolvable after we load module A.
37 int *module_a_var = (int *) modset.GetSym("module_a_var"); 41 int *module_a_var = (int *) modset.GetSym("module_a_var");
38 ASSERT_EQ(module_a_var, NULL); 42 ASSERT_EQ(module_a_var, NULL);
39 43
40 modset.AddByFilename(module_a_filename); 44 modset.AddBySoname(module_a_soname);
41 module_a_var = (int *) modset.GetSym("module_a_var"); 45 module_a_var = (int *) modset.GetSym("module_a_var");
42 ASSERT_NE(module_a_var, NULL); 46 ASSERT_NE(module_a_var, NULL);
43 ASSERT_EQ(*module_a_var, 2345); 47 ASSERT_EQ(*module_a_var, 2345);
44 48
45 modset.AddByFilename(module_b_filename); 49 modset.AddBySoname(module_b_soname);
46 int *module_b_var = (int *) modset.GetSym("module_b_var"); 50 int *module_b_var = (int *) modset.GetSym("module_b_var");
47 ASSERT_NE(module_b_var, NULL); 51 ASSERT_NE(module_b_var, NULL);
48 ASSERT_EQ(*module_b_var, 1234); 52 ASSERT_EQ(*module_b_var, 1234);
49 53
50 modset.AddByFilename(module_tls_filename); 54 modset.AddBySoname(module_tls_soname);
51 55
52 modset.ResolveRefs(); 56 modset.ResolveRefs();
53 57
54 // Check that "addr_of_module_a_var" has been correctly relocated to 58 // Check that "addr_of_module_a_var" has been correctly relocated to
55 // point to the other module. 59 // point to the other module.
56 int **addr_of_module_a_var = (int **) modset.GetSym("addr_of_module_a_var"); 60 int **addr_of_module_a_var = (int **) modset.GetSym("addr_of_module_a_var");
57 ASSERT_NE(addr_of_module_a_var, NULL); 61 ASSERT_NE(addr_of_module_a_var, NULL);
58 ASSERT_EQ(*addr_of_module_a_var, module_a_var); 62 ASSERT_EQ(*addr_of_module_a_var, module_a_var);
59 63
60 // Test that TLS variables are instantiated and aligned properly. 64 // Test that TLS variables are instantiated and aligned properly.
61 CheckTlsVar<int>(&modset, "get_tls_var1", sizeof(int), 123); 65 CheckTlsVar<int>(&modset, "get_tls_var1", sizeof(int), 123);
62 CheckTlsVar<int *>(&modset, "get_tls_var2", sizeof(int), module_a_var); 66 CheckTlsVar<int *>(&modset, "get_tls_var2", sizeof(int), module_a_var);
63 CheckTlsVar<int>(&modset, "get_tls_var_aligned", 256, 345); 67 CheckTlsVar<int>(&modset, "get_tls_var_aligned", 256, 345);
64 CheckTlsVar<int>(&modset, "get_tls_bss_var1", sizeof(int), 0); 68 CheckTlsVar<int>(&modset, "get_tls_bss_var1", sizeof(int), 0);
65 CheckTlsVar<int>(&modset, "get_tls_bss_var_aligned", 256, 0); 69 CheckTlsVar<int>(&modset, "get_tls_bss_var_aligned", 256, 0);
66 70
67 return 0; 71 return 0;
68 } 72 }
OLDNEW
« no previous file with comments | « tests/pnacl_dynamic_loading/nacl.scons ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698