1 /* 2 * Copyright (C) 2016 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 #include <string> 18 #include <vector> 19 #include <sstream> 20 21 #include <sys/types.h> 22 #include <unistd.h> 23 24 #include "base/unix_file/fd_file.h" 25 #include "common_runtime_test.h" 26 #include "exec_utils.h" 27 #include "utils.h" 28 29 namespace art { 30 31 static const char kDexFileLayoutInputDex[] = 32 "ZGV4CjAzNQD1KW3+B8NAB0f2A/ZVIBJ0aHrGIqcpVTAUAgAAcAAAAHhWNBIAAAAAAAAAAIwBAAAH" 33 "AAAAcAAAAAQAAACMAAAAAQAAAJwAAAAAAAAAAAAAAAMAAACoAAAAAgAAAMAAAAAUAQAAAAEAADAB" 34 "AAA4AQAAQAEAAEgBAABNAQAAUgEAAGYBAAADAAAABAAAAAUAAAAGAAAABgAAAAMAAAAAAAAAAAAA" 35 "AAAAAAABAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAEAAAAAAAAAdQEAAAAAAAABAAAA" 36 "AAAAAAIAAAAAAAAAAgAAAAAAAAB/AQAAAAAAAAEAAQABAAAAaQEAAAQAAABwEAIAAAAOAAEAAQAB" 37 "AAAAbwEAAAQAAABwEAIAAAAOAAY8aW5pdD4ABkEuamF2YQAGQi5qYXZhAANMQTsAA0xCOwASTGph" 38 "dmEvbGFuZy9PYmplY3Q7AAFWAAQABw48AAQABw48AAAAAQAAgIAEgAIAAAEAAYCABJgCAAAACwAA" 39 "AAAAAAABAAAAAAAAAAEAAAAHAAAAcAAAAAIAAAAEAAAAjAAAAAMAAAABAAAAnAAAAAUAAAADAAAA" 40 "qAAAAAYAAAACAAAAwAAAAAEgAAACAAAAAAEAAAIgAAAHAAAAMAEAAAMgAAACAAAAaQEAAAAgAAAC" 41 "AAAAdQEAAAAQAAABAAAAjAEAAA=="; 42 43 static const char kDexFileLayoutInputProfile[] = 44 "cHJvADAwNQABCwABAAAAAAD1KW3+Y2xhc3Nlcy5kZXgBAA=="; 45 46 // Dex file with catch handler unreferenced by try blocks. 47 // Constructed by building a dex file with try/catch blocks and hex editing. 48 static const char kUnreferencedCatchHandlerInputDex[] = 49 "ZGV4CjAzNQD+exd52Y0f9nY5x5GmInXq5nXrO6Kl2RV4AwAAcAAAAHhWNBIAAAAAAAAAANgCAAAS" 50 "AAAAcAAAAAgAAAC4AAAAAwAAANgAAAABAAAA/AAAAAQAAAAEAQAAAQAAACQBAAA0AgAARAEAANYB" 51 "AADeAQAA5gEAAO4BAAAAAgAADwIAACYCAAA9AgAAUQIAAGUCAAB5AgAAfwIAAIUCAACIAgAAjAIA" 52 "AKECAACnAgAArAIAAAQAAAAFAAAABgAAAAcAAAAIAAAACQAAAAwAAAAOAAAADAAAAAYAAAAAAAAA" 53 "DQAAAAYAAADIAQAADQAAAAYAAADQAQAABQABABAAAAAAAAAAAAAAAAAAAgAPAAAAAQABABEAAAAD" 54 "AAAAAAAAAAAAAAABAAAAAwAAAAAAAAADAAAAAAAAAMgCAAAAAAAAAQABAAEAAAC1AgAABAAAAHAQ" 55 "AwAAAA4AAwABAAIAAgC6AgAAIQAAAGIAAAAaAQoAbiACABAAYgAAABoBCwBuIAIAEAAOAA0AYgAA" 56 "ABoBAQBuIAIAEAAo8A0AYgAAABoBAgBuIAIAEAAo7gAAAAAAAAcAAQAHAAAABwABAAIBAg8BAhgA" 57 "AQAAAAQAAAABAAAABwAGPGluaXQ+AAZDYXRjaDEABkNhdGNoMgAQSGFuZGxlclRlc3QuamF2YQAN" 58 "TEhhbmRsZXJUZXN0OwAVTGphdmEvaW8vUHJpbnRTdHJlYW07ABVMamF2YS9sYW5nL0V4Y2VwdGlv" 59 "bjsAEkxqYXZhL2xhbmcvT2JqZWN0OwASTGphdmEvbGFuZy9TdHJpbmc7ABJMamF2YS9sYW5nL1N5" 60 "c3RlbTsABFRyeTEABFRyeTIAAVYAAlZMABNbTGphdmEvbGFuZy9TdHJpbmc7AARtYWluAANvdXQA" 61 "B3ByaW50bG4AAQAHDgAEAQAHDn17AncdHoseAAAAAgAAgYAExAIBCdwCAAANAAAAAAAAAAEAAAAA" 62 "AAAAAQAAABIAAABwAAAAAgAAAAgAAAC4AAAAAwAAAAMAAADYAAAABAAAAAEAAAD8AAAABQAAAAQA" 63 "AAAEAQAABgAAAAEAAAAkAQAAASAAAAIAAABEAQAAARAAAAIAAADIAQAAAiAAABIAAADWAQAAAyAA" 64 "AAIAAAC1AgAAACAAAAEAAADIAgAAABAAAAEAAADYAgAA"; 65 66 // Dex file with 0-size (catch all only) catch handler unreferenced by try blocks. 67 // Constructed by building a dex file with try/catch blocks and hex editing. 68 static const char kUnreferenced0SizeCatchHandlerInputDex[] = 69 "ZGV4CjAzNQCEbEEvMstSNpQpjPdfMEfUBS48cis2QRJoAwAAcAAAAHhWNBIAAAAAAAAAAMgCAAAR" 70 "AAAAcAAAAAcAAAC0AAAAAwAAANAAAAABAAAA9AAAAAQAAAD8AAAAAQAAABwBAAAsAgAAPAEAAOoB" 71 "AADyAQAABAIAABMCAAAqAgAAPgIAAFICAABmAgAAaQIAAG0CAACCAgAAhgIAAIoCAACQAgAAlQIA" 72 "AJ4CAACiAgAAAgAAAAMAAAAEAAAABQAAAAYAAAAHAAAACQAAAAcAAAAFAAAAAAAAAAgAAAAFAAAA" 73 "3AEAAAgAAAAFAAAA5AEAAAQAAQANAAAAAAAAAAAAAAAAAAIADAAAAAEAAQAOAAAAAgAAAAAAAAAA" 74 "AAAAAQAAAAIAAAAAAAAAAQAAAAAAAAC5AgAAAAAAAAEAAQABAAAApgIAAAQAAABwEAMAAAAOAAQA" 75 "AQACAAIAqwIAAC8AAABiAAAAGgEPAG4gAgAQAGIAAAAaAQoAbiACABAAYgAAABoBEABuIAIAEABi" 76 "AAAAGgELAG4gAgAQAA4ADQBiAQAAGgIKAG4gAgAhACcADQBiAQAAGgILAG4gAgAhACcAAAAAAAAA" 77 "BwABAA4AAAAHAAEAAgAdACYAAAABAAAAAwAAAAEAAAAGAAY8aW5pdD4AEEhhbmRsZXJUZXN0Lmph" 78 "dmEADUxIYW5kbGVyVGVzdDsAFUxqYXZhL2lvL1ByaW50U3RyZWFtOwASTGphdmEvbGFuZy9PYmpl" 79 "Y3Q7ABJMamF2YS9sYW5nL1N0cmluZzsAEkxqYXZhL2xhbmcvU3lzdGVtOwABVgACVkwAE1tMamF2" 80 "YS9sYW5nL1N0cmluZzsAAmYxAAJmMgAEbWFpbgADb3V0AAdwcmludGxuAAJ0MQACdDIAAQAHDgAE" 81 "AQAHDnl7eXkCeB2bAAAAAgAAgYAEvAIBCdQCAA0AAAAAAAAAAQAAAAAAAAABAAAAEQAAAHAAAAAC" 82 "AAAABwAAALQAAAADAAAAAwAAANAAAAAEAAAAAQAAAPQAAAAFAAAABAAAAPwAAAAGAAAAAQAAABwB" 83 "AAABIAAAAgAAADwBAAABEAAAAgAAANwBAAACIAAAEQAAAOoBAAADIAAAAgAAAKYCAAAAIAAAAQAA" 84 "ALkCAAAAEAAAAQAAAMgCAAA="; 85 86 // Dex file with an unreferenced catch handler at end of code item. 87 // Constructed by building a dex file with try/catch blocks and hex editing. 88 static const char kUnreferencedEndingCatchHandlerInputDex[] = 89 "ZGV4CjAzNQCEflufI6xGTDDRmLpbfYi6ujPrDLIwvYcEBAAAcAAAAHhWNBIAAAAAAAAAAGQDAAAT" 90 "AAAAcAAAAAgAAAC8AAAAAwAAANwAAAABAAAAAAEAAAUAAAAIAQAAAQAAADABAAC0AgAAUAEAAE4C" 91 "AABWAgAAXgIAAGYCAAB4AgAAhwIAAJ4CAAC1AgAAyQIAAN0CAADxAgAA9wIAAP0CAAAAAwAABAMA" 92 "ABkDAAAcAwAAIgMAACcDAAAEAAAABQAAAAYAAAAHAAAACAAAAAkAAAAMAAAADgAAAAwAAAAGAAAA" 93 "AAAAAA0AAAAGAAAAQAIAAA0AAAAGAAAASAIAAAUAAQARAAAAAAAAAAAAAAAAAAAADwAAAAAAAgAQ" 94 "AAAAAQABABIAAAADAAAAAAAAAAAAAAABAAAAAwAAAAAAAAADAAAAAAAAAFADAAAAAAAAAQABAAEA" 95 "AAAwAwAABAAAAHAQBAAAAA4AAgAAAAIAAgA1AwAAIQAAAGIAAAAaAQoAbiADABAAYgAAABoBCwBu" 96 "IAMAEAAOAA0AYgAAABoBAQBuIAMAEAAo8A0AYgAAABoBAgBuIAMAEAAo7gAAAAAAAAcAAQAHAAAA" 97 "BwABAAIBAg8BAhgAAwABAAIAAgBCAwAAIQAAAGIAAAAaAQoAbiADABAAYgAAABoBCwBuIAMAEAAO" 98 "AA0AYgAAABoBAQBuIAMAEAAo8A0AYgAAABoBAgBuIAMAEAAo7gAAAAAAAAcAAQAHAAAABwABAAIB" 99 "Ag8BAhgAAQAAAAQAAAABAAAABwAGPGluaXQ+AAZDYXRjaDEABkNhdGNoMgAQSGFuZGxlclRlc3Qu" 100 "amF2YQANTEhhbmRsZXJUZXN0OwAVTGphdmEvaW8vUHJpbnRTdHJlYW07ABVMamF2YS9sYW5nL0V4" 101 "Y2VwdGlvbjsAEkxqYXZhL2xhbmcvT2JqZWN0OwASTGphdmEvbGFuZy9TdHJpbmc7ABJMamF2YS9s" 102 "YW5nL1N5c3RlbTsABFRyeTEABFRyeTIAAVYAAlZMABNbTGphdmEvbGFuZy9TdHJpbmc7AAFhAARt" 103 "YWluAANvdXQAB3ByaW50bG4AAQAHDgAEAAcOfHsCeB0eih4AEQEABw59ewJ3HR6LHgAAAAMAAIGA" 104 "BNACAQnoAgEJ1AMAAA0AAAAAAAAAAQAAAAAAAAABAAAAEwAAAHAAAAACAAAACAAAALwAAAADAAAA" 105 "AwAAANwAAAAEAAAAAQAAAAABAAAFAAAABQAAAAgBAAAGAAAAAQAAADABAAABIAAAAwAAAFABAAAB" 106 "EAAAAgAAAEACAAACIAAAEwAAAE4CAAADIAAAAwAAADADAAAAIAAAAQAAAFADAAAAEAAAAQAAAGQD" 107 "AAA="; 108 109 // Dex file with multiple code items that have the same debug_info_off_. Constructed by a modified 110 // dexlayout on XandY. 111 static const char kDexFileDuplicateOffset[] = 112 "ZGV4CjAzNwAQfXfPCB8qCxo7MqdFhmHZQwCv8+udHD8MBAAAcAAAAHhWNBIAAAAAAAAAAFQDAAAT" 113 "AAAAcAAAAAgAAAC8AAAAAQAAANwAAAABAAAA6AAAAAUAAADwAAAAAwAAABgBAACUAgAAeAEAABQC" 114 "AAAeAgAAJgIAACsCAAAyAgAANwIAAFsCAAB7AgAAngIAALICAAC1AgAAvQIAAMUCAADIAgAA1QIA" 115 "AOkCAADvAgAA9QIAAPwCAAACAAAAAwAAAAQAAAAFAAAABgAAAAcAAAAIAAAACQAAAAkAAAAHAAAA" 116 "AAAAAAIAAQASAAAAAAAAAAEAAAABAAAAAQAAAAIAAAAAAAAAAgAAAAEAAAAGAAAAAQAAAAAAAAAA" 117 "AAAABgAAAAAAAAAKAAAAAAAAACsDAAAAAAAAAQAAAAAAAAAGAAAAAAAAAAsAAAD0AQAANQMAAAAA" 118 "AAACAAAAAAAAAAAAAAAAAAAACwAAAAQCAAA/AwAAAAAAAAIAAAAUAwAAGgMAAAEAAAAjAwAAAQAB" 119 "AAEAAAAFAAAABAAAAHAQBAAAAA4AAQABAAEAAAAFAAAABAAAAHAQBAAAAA4AAQAAAAEAAAAFAAAA" 120 "CAAAACIAAQBwEAEAAABpAAAADgABAAEAAQAAAAUAAAAEAAAAcBAAAAAADgB4AQAAAAAAAAAAAAAA" 121 "AAAAhAEAAAAAAAAAAAAAAAAAAAg8Y2xpbml0PgAGPGluaXQ+AANMWDsABUxZJFo7AANMWTsAIkxk" 122 "YWx2aWsvYW5ub3RhdGlvbi9FbmNsb3NpbmdDbGFzczsAHkxkYWx2aWsvYW5ub3RhdGlvbi9Jbm5l" 123 "ckNsYXNzOwAhTGRhbHZpay9hbm5vdGF0aW9uL01lbWJlckNsYXNzZXM7ABJMamF2YS9sYW5nL09i" 124 "amVjdDsAAVYABlguamF2YQAGWS5qYXZhAAFaAAthY2Nlc3NGbGFncwASZW1pdHRlcjogamFjay00" 125 "LjI1AARuYW1lAAR0aGlzAAV2YWx1ZQABegARAAcOABMABw4AEgAHDnYAEQAHDgACAwERGAICBAIN" 126 "BAgPFwwCBQERHAEYAQAAAQAAgIAEjAMAAAEAAYCABKQDAQACAAAIAoiABLwDAYCABNwDAAAADwAA" 127 "AAAAAAABAAAAAAAAAAEAAAATAAAAcAAAAAIAAAAIAAAAvAAAAAMAAAABAAAA3AAAAAQAAAABAAAA" 128 "6AAAAAUAAAAFAAAA8AAAAAYAAAADAAAAGAEAAAMQAAACAAAAeAEAAAEgAAAEAAAAjAEAAAYgAAAC" 129 "AAAA9AEAAAIgAAATAAAAFAIAAAMgAAAEAAAA/wIAAAQgAAADAAAAFAMAAAAgAAADAAAAKwMAAAAQ" 130 "AAABAAAAVAMAAA=="; 131 132 // Dex file with null value for annotations_off in the annotation_set_ref_list. 133 // Constructed by building a dex file with annotations and hex editing. 134 static const char kNullSetRefListElementInputDex[] = 135 "ZGV4CjAzNQB1iA+7ZwgkF+7E6ZesYFc2lRAR3qnRAanwAwAAcAAAAHhWNBIAAAAAAAAAACADAAAS" 136 "AAAAcAAAAAgAAAC4AAAAAwAAANgAAAABAAAA/AAAAAQAAAAEAQAAAgAAACQBAACMAgAAZAEAAOgB" 137 "AADwAQAAAAIAAAMCAAAQAgAAIAIAADQCAABIAgAAawIAAI0CAAC1AgAAyAIAANECAADUAgAA2QIA" 138 "ANwCAADjAgAA6QIAAAMAAAAEAAAABQAAAAYAAAAHAAAACAAAAAkAAAAMAAAAAgAAAAMAAAAAAAAA" 139 "DAAAAAcAAAAAAAAADQAAAAcAAADgAQAABgAGAAsAAAAAAAEAAAAAAAAAAgAOAAAAAQAAABAAAAAC" 140 "AAEAAAAAAAAAAAAAAAAAAgAAAAAAAAABAAAAsAEAAAgDAAAAAAAAAQAAAAEmAAACAAAA2AEAAAoA" 141 "AADIAQAAFgMAAAAAAAACAAAAAAAAAHwBAAABAAAA/AIAAAAAAAABAAAAAgMAAAEAAQABAAAA8AIA" 142 "AAQAAABwEAMAAAAOAAIAAgAAAAAA9QIAAAEAAAAOAAAAAAAAAAAAAAAAAAAAAQAAAAEAAABkAQAA" 143 "cAEAAAAAAAAAAAAAAAAAAAEAAAAEAAAAAgAAAAMAAwAGPGluaXQ+AA5Bbm5vQ2xhc3MuamF2YQAB" 144 "TAALTEFubm9DbGFzczsADkxNeUFubm90YXRpb247ABJMamF2YS9sYW5nL09iamVjdDsAEkxqYXZh" 145 "L2xhbmcvU3RyaW5nOwAhTGphdmEvbGFuZy9hbm5vdGF0aW9uL0Fubm90YXRpb247ACBMamF2YS9s" 146 "YW5nL2Fubm90YXRpb24vUmV0ZW50aW9uOwAmTGphdmEvbGFuZy9hbm5vdGF0aW9uL1JldGVudGlv" 147 "blBvbGljeTsAEU15QW5ub3RhdGlvbi5qYXZhAAdSVU5USU1FAAFWAANWTEwAAWEABWFOYW1lAARu" 148 "YW1lAAV2YWx1ZQABAAcOAAICAAAHDgABBQERGwABAQEQFw8AAAIAAICABIQDAQmcAwAAAAECgQgA" 149 "AAARAAAAAAAAAAEAAAAAAAAAAQAAABIAAABwAAAAAgAAAAgAAAC4AAAAAwAAAAMAAADYAAAABAAA" 150 "AAEAAAD8AAAABQAAAAQAAAAEAQAABgAAAAIAAAAkAQAAAhAAAAEAAABkAQAAAxAAAAMAAABwAQAA" 151 "ASAAAAIAAACEAQAABiAAAAIAAACwAQAAARAAAAIAAADYAQAAAiAAABIAAADoAQAAAyAAAAIAAADw" 152 "AgAABCAAAAIAAAD8AgAAACAAAAIAAAAIAwAAABAAAAEAAAAgAwAA"; 153 154 // Dex file with shared empty class data item for multiple class defs. 155 // Constructing by building a dex file with multiple classes and hex editing. 156 static const char kMultiClassDataInputDex[] = 157 "ZGV4CjAzNQALJgF9TtnLq748xVe/+wyxETrT9lTEiW6YAQAAcAAAAHhWNBIAAAAAAAAAADQBAAAI" 158 "AAAAcAAAAAQAAACQAAAAAAAAAAAAAAACAAAAoAAAAAAAAAAAAAAAAgAAALAAAACoAAAA8AAAAPAA" 159 "AAD4AAAAAAEAAAMBAAAIAQAADQEAACEBAAAkAQAAAgAAAAMAAAAEAAAABQAAAAEAAAAGAAAAAgAA" 160 "AAcAAAABAAAAAQYAAAMAAAAAAAAAAAAAAAAAAAAnAQAAAAAAAAIAAAABBgAAAwAAAAAAAAABAAAA" 161 "AAAAACcBAAAAAAAABkEuamF2YQAGQi5qYXZhAAFJAANMQTsAA0xCOwASTGphdmEvbGFuZy9PYmpl" 162 "Y3Q7AAFhAAFiAAAAAAABAAAAARkAAAAIAAAAAAAAAAEAAAAAAAAAAQAAAAgAAABwAAAAAgAAAAQA" 163 "AACQAAAABAAAAAIAAACgAAAABgAAAAIAAACwAAAAAiAAAAgAAADwAAAAACAAAAIAAAAnAQAAABAA" 164 "AAEAAAA0AQAA"; 165 166 // Dex file with code info followed by non 4-byte aligned section. 167 // Constructed a dex file with code info followed by string data and hex edited. 168 static const char kUnalignedCodeInfoInputDex[] = 169 "ZGV4CjAzNQDXJzXNb4iWn2SLhmLydW/8h1K9moERIw7UAQAAcAAAAHhWNBIAAAAAAAAAAEwBAAAG" 170 "AAAAcAAAAAMAAACIAAAAAQAAAJQAAAAAAAAAAAAAAAMAAACgAAAAAQAAALgAAAD8AAAA2AAAAAIB" 171 "AAAKAQAAEgEAABcBAAArAQAALgEAAAIAAAADAAAABAAAAAQAAAACAAAAAAAAAAAAAAAAAAAAAAAA" 172 "AAUAAAABAAAAAAAAAAAAAAABAAAAAQAAAAAAAAABAAAAAAAAADsBAAAAAAAAAQABAAEAAAAxAQAA" 173 "BAAAAHAQAgAAAA4AAQABAAAAAAA2AQAAAQAAAA4ABjxpbml0PgAGQS5qYXZhAANMQTsAEkxqYXZh" 174 "L2xhbmcvT2JqZWN0OwABVgABYQABAAcOAAMABw4AAAABAQCBgATYAQEB8AEAAAALAAAAAAAAAAEA" 175 "AAAAAAAAAQAAAAYAAABwAAAAAgAAAAMAAACIAAAAAwAAAAEAAACUAAAABQAAAAMAAACgAAAABgAA" 176 "AAEAAAC4AAAAASAAAAIAAADYAAAAAiAAAAYAAAACAQAAAyAAAAIAAAAxAQAAACAAAAEAAAA7AQAA" 177 "ABAAAAEAAABMAQAA"; 178 179 // Dex file with class data section preceding code items. 180 // Constructed by passing dex file through dexmerger tool and hex editing. 181 static const char kClassDataBeforeCodeInputDex[] = 182 "ZGV4CjAzNQCZKmCu3XXn4zvxCh5VH0gZNNobEAcsc49EAgAAcAAAAHhWNBIAAAAAAAAAAAQBAAAJ" 183 "AAAAcAAAAAQAAACUAAAAAgAAAKQAAAAAAAAAAAAAAAUAAAC8AAAAAQAAAOQAAABAAQAABAEAAPgB" 184 "AAAAAgAACAIAAAsCAAAQAgAAJAIAACcCAAAqAgAALQIAAAIAAAADAAAABAAAAAUAAAACAAAAAAAA" 185 "AAAAAAAFAAAAAwAAAAAAAAABAAEAAAAAAAEAAAAGAAAAAQAAAAcAAAABAAAACAAAAAIAAQAAAAAA" 186 "AQAAAAEAAAACAAAAAAAAAAEAAAAAAAAAjAEAAAAAAAALAAAAAAAAAAEAAAAAAAAAAQAAAAkAAABw" 187 "AAAAAgAAAAQAAACUAAAAAwAAAAIAAACkAAAABQAAAAUAAAC8AAAABgAAAAEAAADkAAAAABAAAAEA" 188 "AAAEAQAAACAAAAEAAACMAQAAASAAAAQAAACkAQAAAiAAAAkAAAD4AQAAAyAAAAQAAAAwAgAAAAAB" 189 "AwCBgASkAwEBvAMBAdADAQHkAwAAAQABAAEAAAAwAgAABAAAAHAQBAAAAA4AAgABAAAAAAA1AgAA" 190 "AgAAABIQDwACAAEAAAAAADoCAAACAAAAEiAPAAIAAQAAAAAAPwIAAAIAAAASMA8ABjxpbml0PgAG" 191 "QS5qYXZhAAFJAANMQTsAEkxqYXZhL2xhbmcvT2JqZWN0OwABVgABYQABYgABYwABAAcOAAMABw4A" 192 "BgAHDgAJAAcOAA=="; 193 194 // Dex file with local info containing a null type descriptor. 195 // Constructed a dex file with debug info sequence containing DBG_RESTART_LOCAL without any 196 // DBG_START_LOCAL to give it a declared type. 197 static const char kUnknownTypeDebugInfoInputDex[] = 198 "ZGV4CjAzNQBtKqZfzjHLNSNwW2A6Bz9FuCEX0sL+FF38AQAAcAAAAHhWNBIAAAAAAAAAAHQBAAAI" 199 "AAAAcAAAAAQAAACQAAAAAgAAAKAAAAAAAAAAAAAAAAMAAAC4AAAAAQAAANAAAAAMAQAA8AAAABwB" 200 "AAAkAQAALAEAAC8BAAA0AQAASAEAAEsBAABOAQAAAgAAAAMAAAAEAAAABQAAAAIAAAAAAAAAAAAA" 201 "AAUAAAADAAAAAAAAAAEAAQAAAAAAAQAAAAYAAAACAAEAAAAAAAEAAAABAAAAAgAAAAAAAAABAAAA" 202 "AAAAAGMBAAAAAAAAAQABAAEAAABUAQAABAAAAHAQAgAAAA4AAgABAAAAAABZAQAAAgAAABIQDwAG" 203 "PGluaXQ+AAZBLmphdmEAAUkAA0xBOwASTGphdmEvbGFuZy9PYmplY3Q7AAFWAAFhAAR0aGlzAAEA" 204 "Bw4AAwAHDh4GAAYAAAAAAQEAgYAE8AEBAYgCAAAACwAAAAAAAAABAAAAAAAAAAEAAAAIAAAAcAAA" 205 "AAIAAAAEAAAAkAAAAAMAAAACAAAAoAAAAAUAAAADAAAAuAAAAAYAAAABAAAA0AAAAAEgAAACAAAA" 206 "8AAAAAIgAAAIAAAAHAEAAAMgAAACAAAAVAEAAAAgAAABAAAAYwEAAAAQAAABAAAAdAEAAA=="; 207 208 // Dex file with multiple class data items pointing to the same code item. 209 // Constructed by hex editing. 210 static const char kDuplicateCodeItemInputDex[] = 211 "ZGV4CjAzNQCwKtVglQOmLWuHwldN5jkBOInC7mTMhJMAAgAAcAAAAHhWNBIAAAAAAAAAAHgBAAAH" 212 "AAAAcAAAAAMAAACMAAAAAQAAAJgAAAAAAAAAAAAAAAQAAACkAAAAAQAAAMQAAAAcAQAA5AAAACQB" 213 "AAAsAQAANAEAADkBAABNAQAAUAEAAFMBAAACAAAAAwAAAAQAAAAEAAAAAgAAAAAAAAAAAAAAAAAA" 214 "AAAAAAAFAAAAAAAAAAYAAAABAAAAAAAAAAAAAAABAAAAAQAAAAAAAAABAAAAAAAAAGUBAAAAAAAA" 215 "AQABAAEAAABWAQAABAAAAHAQAwAAAA4AAQABAAAAAABbAQAAAQAAAA4AAAABAAEAAAAAAGABAAAB" 216 "AAAADgAAAAY8aW5pdD4ABkEuamF2YQADTEE7ABJMamF2YS9sYW5nL09iamVjdDsAAVYAAWEAAWIA" 217 "AQAHDgADAAcOAAUABw4AAAABAgCBgATkAQEA/AEBAPwBAAsAAAAAAAAAAQAAAAAAAAABAAAABwAA" 218 "AHAAAAACAAAAAwAAAIwAAAADAAAAAQAAAJgAAAAFAAAABAAAAKQAAAAGAAAAAQAAAMQAAAABIAAA" 219 "AwAAAOQAAAACIAAABwAAACQBAAADIAAAAwAAAFYBAAAAIAAAAQAAAGUBAAAAEAAAAQAAAHgBAAA="; 220 221 static void WriteBase64ToFile(const char* base64, File* file) { 222 // Decode base64. 223 CHECK(base64 != nullptr); 224 size_t length; 225 std::unique_ptr<uint8_t[]> bytes(DecodeBase64(base64, &length)); 226 CHECK(bytes != nullptr); 227 if (!file->WriteFully(bytes.get(), length)) { 228 PLOG(FATAL) << "Failed to write base64 as file"; 229 } 230 } 231 232 static void WriteFileBase64(const char* base64, const char* location) { 233 // Write to provided file. 234 std::unique_ptr<File> file(OS::CreateEmptyFile(location)); 235 CHECK(file != nullptr); 236 WriteBase64ToFile(base64, file.get()); 237 if (file->FlushCloseOrErase() != 0) { 238 PLOG(FATAL) << "Could not flush and close test file."; 239 } 240 } 241 242 class DexLayoutTest : public CommonRuntimeTest { 243 protected: 244 virtual void SetUp() { 245 CommonRuntimeTest::SetUp(); 246 } 247 248 // Runs FullPlainOutput test. 249 bool FullPlainOutputExec(std::string* error_msg) { 250 // TODO: dexdump2 -> dexdump ? 251 ScratchFile dexdump_output; 252 const std::string& dexdump_filename = dexdump_output.GetFilename(); 253 std::string dexdump = GetTestAndroidRoot() + "/bin/dexdump2"; 254 EXPECT_TRUE(OS::FileExists(dexdump.c_str())) << dexdump << " should be a valid file path"; 255 256 ScratchFile dexlayout_output; 257 const std::string& dexlayout_filename = dexlayout_output.GetFilename(); 258 std::string dexlayout = GetTestAndroidRoot() + "/bin/dexlayout"; 259 EXPECT_TRUE(OS::FileExists(dexlayout.c_str())) << dexlayout << " should be a valid file path"; 260 261 for (const std::string &dex_file : GetLibCoreDexFileNames()) { 262 std::vector<std::string> dexdump_exec_argv = 263 { dexdump, "-d", "-f", "-h", "-l", "plain", "-o", dexdump_filename, dex_file }; 264 std::vector<std::string> dexlayout_exec_argv = 265 { dexlayout, "-d", "-f", "-h", "-l", "plain", "-o", dexlayout_filename, dex_file }; 266 if (!::art::Exec(dexdump_exec_argv, error_msg)) { 267 return false; 268 } 269 if (!::art::Exec(dexlayout_exec_argv, error_msg)) { 270 return false; 271 } 272 std::vector<std::string> diff_exec_argv = 273 { "/usr/bin/diff", dexdump_filename, dexlayout_filename }; 274 if (!::art::Exec(diff_exec_argv, error_msg)) { 275 return false; 276 } 277 } 278 return true; 279 } 280 281 // Runs DexFileOutput test. 282 bool DexFileOutputExec(std::string* error_msg) { 283 ScratchFile tmp_file; 284 const std::string& tmp_name = tmp_file.GetFilename(); 285 size_t tmp_last_slash = tmp_name.rfind('/'); 286 std::string tmp_dir = tmp_name.substr(0, tmp_last_slash + 1); 287 std::string dexlayout = GetTestAndroidRoot() + "/bin/dexlayout"; 288 EXPECT_TRUE(OS::FileExists(dexlayout.c_str())) << dexlayout << " should be a valid file path"; 289 290 for (const std::string &dex_file : GetLibCoreDexFileNames()) { 291 std::vector<std::string> dexlayout_exec_argv = 292 { dexlayout, "-w", tmp_dir, "-o", tmp_name, dex_file }; 293 if (!::art::Exec(dexlayout_exec_argv, error_msg)) { 294 return false; 295 } 296 size_t dex_file_last_slash = dex_file.rfind("/"); 297 std::string dex_file_name = dex_file.substr(dex_file_last_slash + 1); 298 std::vector<std::string> unzip_exec_argv = 299 { "/usr/bin/unzip", dex_file, "classes.dex", "-d", tmp_dir}; 300 if (!::art::Exec(unzip_exec_argv, error_msg)) { 301 return false; 302 } 303 std::vector<std::string> diff_exec_argv = 304 { "/usr/bin/diff", tmp_dir + "classes.dex" , tmp_dir + dex_file_name }; 305 if (!::art::Exec(diff_exec_argv, error_msg)) { 306 return false; 307 } 308 std::vector<std::string> rm_zip_exec_argv = { "/bin/rm", tmp_dir + "classes.dex" }; 309 if (!::art::Exec(rm_zip_exec_argv, error_msg)) { 310 return false; 311 } 312 std::vector<std::string> rm_out_exec_argv = { "/bin/rm", tmp_dir + dex_file_name }; 313 if (!::art::Exec(rm_out_exec_argv, error_msg)) { 314 return false; 315 } 316 } 317 return true; 318 } 319 320 // Runs DexFileLayout test. 321 bool DexFileLayoutExec(std::string* error_msg) { 322 ScratchFile tmp_file; 323 std::string tmp_name = tmp_file.GetFilename(); 324 size_t tmp_last_slash = tmp_name.rfind("/"); 325 std::string tmp_dir = tmp_name.substr(0, tmp_last_slash + 1); 326 327 // Write inputs and expected outputs. 328 std::string dex_file = tmp_dir + "classes.dex"; 329 WriteFileBase64(kDexFileLayoutInputDex, dex_file.c_str()); 330 std::string profile_file = tmp_dir + "primary.prof"; 331 WriteFileBase64(kDexFileLayoutInputProfile, profile_file.c_str()); 332 std::string output_dex = tmp_dir + "classes.dex.new"; 333 334 std::string dexlayout = GetTestAndroidRoot() + "/bin/dexlayout"; 335 EXPECT_TRUE(OS::FileExists(dexlayout.c_str())) << dexlayout << " should be a valid file path"; 336 337 std::vector<std::string> dexlayout_exec_argv = 338 { dexlayout, "-v", "-w", tmp_dir, "-o", tmp_name, "-p", profile_file, dex_file }; 339 if (!::art::Exec(dexlayout_exec_argv, error_msg)) { 340 return false; 341 } 342 343 // -v makes sure that the layout did not corrupt the dex file. 344 345 std::vector<std::string> rm_exec_argv = 346 { "/bin/rm", dex_file, profile_file, output_dex }; 347 if (!::art::Exec(rm_exec_argv, error_msg)) { 348 return false; 349 } 350 return true; 351 } 352 353 // Runs UnreferencedCatchHandlerTest & Unreferenced0SizeCatchHandlerTest. 354 bool UnreferencedCatchHandlerExec(std::string* error_msg, const char* filename) { 355 ScratchFile tmp_file; 356 std::string tmp_name = tmp_file.GetFilename(); 357 size_t tmp_last_slash = tmp_name.rfind("/"); 358 std::string tmp_dir = tmp_name.substr(0, tmp_last_slash + 1); 359 360 // Write inputs and expected outputs. 361 std::string input_dex = tmp_dir + "classes.dex"; 362 WriteFileBase64(filename, input_dex.c_str()); 363 std::string output_dex = tmp_dir + "classes.dex.new"; 364 365 std::string dexlayout = GetTestAndroidRoot() + "/bin/dexlayout"; 366 EXPECT_TRUE(OS::FileExists(dexlayout.c_str())) << dexlayout << " should be a valid file path"; 367 368 std::vector<std::string> dexlayout_exec_argv = 369 { dexlayout, "-w", tmp_dir, "-o", "/dev/null", input_dex }; 370 if (!::art::Exec(dexlayout_exec_argv, error_msg)) { 371 return false; 372 } 373 374 // Diff input and output. They should be the same. 375 std::vector<std::string> diff_exec_argv = { "/usr/bin/diff", input_dex, output_dex }; 376 if (!::art::Exec(diff_exec_argv, error_msg)) { 377 return false; 378 } 379 380 std::vector<std::string> rm_exec_argv = { "/bin/rm", input_dex, output_dex }; 381 if (!::art::Exec(rm_exec_argv, error_msg)) { 382 return false; 383 } 384 return true; 385 } 386 387 bool DexLayoutExec(ScratchFile* dex_file, 388 const char* dex_filename, 389 ScratchFile* profile_file, 390 const char* profile_filename, 391 std::vector<std::string>& dexlayout_exec_argv) { 392 WriteBase64ToFile(dex_filename, dex_file->GetFile()); 393 EXPECT_EQ(dex_file->GetFile()->Flush(), 0); 394 if (profile_file != nullptr) { 395 WriteBase64ToFile(profile_filename, profile_file->GetFile()); 396 EXPECT_EQ(profile_file->GetFile()->Flush(), 0); 397 } 398 std::string error_msg; 399 const bool result = ::art::Exec(dexlayout_exec_argv, &error_msg); 400 if (!result) { 401 LOG(ERROR) << "Error: " << error_msg; 402 return false; 403 } 404 return true; 405 } 406 }; 407 408 409 TEST_F(DexLayoutTest, FullPlainOutput) { 410 // Disable test on target. 411 TEST_DISABLED_FOR_TARGET(); 412 std::string error_msg; 413 ASSERT_TRUE(FullPlainOutputExec(&error_msg)) << error_msg; 414 } 415 416 TEST_F(DexLayoutTest, DexFileOutput) { 417 // Disable test on target. 418 TEST_DISABLED_FOR_TARGET(); 419 std::string error_msg; 420 ASSERT_TRUE(DexFileOutputExec(&error_msg)) << error_msg; 421 } 422 423 TEST_F(DexLayoutTest, DexFileLayout) { 424 // Disable test on target. 425 TEST_DISABLED_FOR_TARGET(); 426 std::string error_msg; 427 ASSERT_TRUE(DexFileLayoutExec(&error_msg)) << error_msg; 428 } 429 430 TEST_F(DexLayoutTest, UnreferencedCatchHandler) { 431 // Disable test on target. 432 TEST_DISABLED_FOR_TARGET(); 433 std::string error_msg; 434 ASSERT_TRUE(UnreferencedCatchHandlerExec(&error_msg, 435 kUnreferencedCatchHandlerInputDex)) << error_msg; 436 } 437 438 TEST_F(DexLayoutTest, Unreferenced0SizeCatchHandler) { 439 // Disable test on target. 440 TEST_DISABLED_FOR_TARGET(); 441 std::string error_msg; 442 ASSERT_TRUE(UnreferencedCatchHandlerExec(&error_msg, 443 kUnreferenced0SizeCatchHandlerInputDex)) << error_msg; 444 } 445 446 TEST_F(DexLayoutTest, UnreferencedEndingCatchHandler) { 447 // Disable test on target. 448 TEST_DISABLED_FOR_TARGET(); 449 std::string error_msg; 450 ASSERT_TRUE(UnreferencedCatchHandlerExec(&error_msg, 451 kUnreferencedEndingCatchHandlerInputDex)) << error_msg; 452 } 453 454 TEST_F(DexLayoutTest, DuplicateOffset) { 455 ScratchFile temp_dex; 456 std::string dexlayout = GetTestAndroidRoot() + "/bin/dexlayout"; 457 EXPECT_TRUE(OS::FileExists(dexlayout.c_str())) << dexlayout << " should be a valid file path"; 458 std::vector<std::string> dexlayout_exec_argv = 459 { dexlayout, "-a", "-i", "-o", "/dev/null", temp_dex.GetFilename() }; 460 ASSERT_TRUE(DexLayoutExec(&temp_dex, 461 kDexFileDuplicateOffset, 462 nullptr /* profile_file */, 463 nullptr /* profile_filename */, 464 dexlayout_exec_argv)); 465 } 466 467 TEST_F(DexLayoutTest, NullSetRefListElement) { 468 ScratchFile temp_dex; 469 std::string dexlayout = GetTestAndroidRoot() + "/bin/dexlayout"; 470 EXPECT_TRUE(OS::FileExists(dexlayout.c_str())) << dexlayout << " should be a valid file path"; 471 std::vector<std::string> dexlayout_exec_argv = 472 { dexlayout, "-o", "/dev/null", temp_dex.GetFilename() }; 473 ASSERT_TRUE(DexLayoutExec(&temp_dex, 474 kNullSetRefListElementInputDex, 475 nullptr /* profile_file */, 476 nullptr /* profile_filename */, 477 dexlayout_exec_argv)); 478 } 479 480 TEST_F(DexLayoutTest, MultiClassData) { 481 ScratchFile temp_dex; 482 ScratchFile temp_profile; 483 std::string dexlayout = GetTestAndroidRoot() + "/bin/dexlayout"; 484 EXPECT_TRUE(OS::FileExists(dexlayout.c_str())) << dexlayout << " should be a valid file path"; 485 std::vector<std::string> dexlayout_exec_argv = 486 { dexlayout, "-p", temp_profile.GetFilename(), "-o", "/dev/null", temp_dex.GetFilename() }; 487 ASSERT_TRUE(DexLayoutExec(&temp_dex, 488 kMultiClassDataInputDex, 489 &temp_profile, 490 kDexFileLayoutInputProfile, 491 dexlayout_exec_argv)); 492 } 493 494 TEST_F(DexLayoutTest, UnalignedCodeInfo) { 495 ScratchFile temp_dex; 496 ScratchFile temp_profile; 497 std::string dexlayout = GetTestAndroidRoot() + "/bin/dexlayout"; 498 EXPECT_TRUE(OS::FileExists(dexlayout.c_str())) << dexlayout << " should be a valid file path"; 499 std::vector<std::string> dexlayout_exec_argv = 500 { dexlayout, "-p", temp_profile.GetFilename(), "-o", "/dev/null", temp_dex.GetFilename() }; 501 ASSERT_TRUE(DexLayoutExec(&temp_dex, 502 kUnalignedCodeInfoInputDex, 503 &temp_profile, 504 kDexFileLayoutInputProfile, 505 dexlayout_exec_argv)); 506 } 507 508 TEST_F(DexLayoutTest, ClassDataBeforeCode) { 509 ScratchFile temp_dex; 510 ScratchFile temp_profile; 511 std::string dexlayout = GetTestAndroidRoot() + "/bin/dexlayout"; 512 EXPECT_TRUE(OS::FileExists(dexlayout.c_str())) << dexlayout << " should be a valid file path"; 513 std::vector<std::string> dexlayout_exec_argv = 514 { dexlayout, "-p", temp_profile.GetFilename(), "-o", "/dev/null", temp_dex.GetFilename() }; 515 ASSERT_TRUE(DexLayoutExec(&temp_dex, 516 kClassDataBeforeCodeInputDex, 517 &temp_profile, 518 kDexFileLayoutInputProfile, 519 dexlayout_exec_argv)); 520 } 521 522 TEST_F(DexLayoutTest, UnknownTypeDebugInfo) { 523 ScratchFile temp_dex; 524 std::string dexlayout = GetTestAndroidRoot() + "/bin/dexlayout"; 525 EXPECT_TRUE(OS::FileExists(dexlayout.c_str())) << dexlayout << " should be a valid file path"; 526 std::vector<std::string> dexlayout_exec_argv = 527 { dexlayout, "-o", "/dev/null", temp_dex.GetFilename() }; 528 ASSERT_TRUE(DexLayoutExec(&temp_dex, 529 kUnknownTypeDebugInfoInputDex, 530 nullptr /* profile_file */, 531 nullptr /* profile_filename */, 532 dexlayout_exec_argv)); 533 } 534 535 TEST_F(DexLayoutTest, DuplicateCodeItem) { 536 ScratchFile temp_dex; 537 std::string dexlayout = GetTestAndroidRoot() + "/bin/dexlayout"; 538 EXPECT_TRUE(OS::FileExists(dexlayout.c_str())) << dexlayout << " should be a valid file path"; 539 std::vector<std::string> dexlayout_exec_argv = 540 { dexlayout, "-o", "/dev/null", temp_dex.GetFilename() }; 541 ASSERT_TRUE(DexLayoutExec(&temp_dex, 542 kDuplicateCodeItemInputDex, 543 nullptr /* profile_file */, 544 nullptr /* profile_filename */, 545 dexlayout_exec_argv)); 546 } 547 548 } // namespace art 549