1e31eca900a1f8849af75100c2d92e838d79d0920Kostya Serebryany// Test if asan works with prelink.
2d843fea3d6f7e7dcfcb6e2a98826b85e5106f189Kostya Serebryany// It does not actually use prelink, but relies on ld's flag -Ttext-segment
3d843fea3d6f7e7dcfcb6e2a98826b85e5106f189Kostya Serebryany// or gold's flag -Ttext (we try the first flag first, if that fails we
4d843fea3d6f7e7dcfcb6e2a98826b85e5106f189Kostya Serebryany// try the second flag).
5e31eca900a1f8849af75100c2d92e838d79d0920Kostya Serebryany//
66efa4d6cf9bb214a5e8ddbb224a69b38c4ae6de6Alexey Samsonov// RUN: %clangxx_asan -c %s -o %t.o
76efa4d6cf9bb214a5e8ddbb224a69b38c4ae6de6Alexey Samsonov// RUN: %clangxx_asan -DBUILD_SO=1 -fPIC -shared %s -o %t.so -Wl,-Ttext-segment=0x3600000000 ||\
86efa4d6cf9bb214a5e8ddbb224a69b38c4ae6de6Alexey Samsonov// RUN: %clangxx_asan -DBUILD_SO=1 -fPIC -shared %s -o %t.so -Wl,-Ttext=0x3600000000
96efa4d6cf9bb214a5e8ddbb224a69b38c4ae6de6Alexey Samsonov// RUN: %clangxx_asan %t.o %t.so -Wl,-R. -o %t
10e31eca900a1f8849af75100c2d92e838d79d0920Kostya Serebryany// RUN: ASAN_OPTIONS=verbosity=1 %t 2>&1 | FileCheck %s
11098847d2a24ca010e543adb3e1140d56f30a6a90Alexey Samsonov
126efa4d6cf9bb214a5e8ddbb224a69b38c4ae6de6Alexey Samsonov// REQUIRES: x86_64-supported-target, asan-64-bits
13e31eca900a1f8849af75100c2d92e838d79d0920Kostya Serebryany#if BUILD_SO
14e31eca900a1f8849af75100c2d92e838d79d0920Kostya Serebryanyint G;
15e31eca900a1f8849af75100c2d92e838d79d0920Kostya Serebryanyint *getG() {
16e31eca900a1f8849af75100c2d92e838d79d0920Kostya Serebryany  return &G;
17e31eca900a1f8849af75100c2d92e838d79d0920Kostya Serebryany}
18e31eca900a1f8849af75100c2d92e838d79d0920Kostya Serebryany#else
19e31eca900a1f8849af75100c2d92e838d79d0920Kostya Serebryany#include <stdio.h>
20e31eca900a1f8849af75100c2d92e838d79d0920Kostya Serebryanyextern int *getG();
21e31eca900a1f8849af75100c2d92e838d79d0920Kostya Serebryanyint main(int argc, char **argv) {
22e31eca900a1f8849af75100c2d92e838d79d0920Kostya Serebryany  long p = (long)getG();
23e31eca900a1f8849af75100c2d92e838d79d0920Kostya Serebryany  printf("SO mapped at %lx\n", p & ~0xffffffffUL);
24e31eca900a1f8849af75100c2d92e838d79d0920Kostya Serebryany  *getG() = 0;
25e31eca900a1f8849af75100c2d92e838d79d0920Kostya Serebryany}
26e31eca900a1f8849af75100c2d92e838d79d0920Kostya Serebryany#endif
2713577fed9ac2ebe5e4800b8f83e3a80832907de2Kostya Serebryany// CHECK: 0x003000000000, 0x004fffffffff{{.*}} MidMem
28e31eca900a1f8849af75100c2d92e838d79d0920Kostya Serebryany// CHECK: SO mapped at 3600000000
29