122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//===- LinkerTest.cpp -----------------------------------------------------===//
222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//
322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//                     The MCLinker Project
422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//
522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao// This file is distributed under the University of Illinois Open Source
622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao// License. See LICENSE.TXT for details.
722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//
822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//===----------------------------------------------------------------------===//
922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include "LinkerTest.h"
1022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
1122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/Environment.h>
1222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/Module.h>
1322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/InputTree.h>
1422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/IRBuilder.h>
1522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/Linker.h>
1622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/LinkerConfig.h>
1787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#include <mcld/LinkerScript.h>
1822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
1922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/Support/Path.h>
2022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
2122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <llvm/Support/ELF.h>
2222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
2322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaousing namespace mcld;
2422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaousing namespace mcld::test;
2522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaousing namespace mcld::sys::fs;
2622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
2722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
2822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao// Constructor can do set-up work for all test here.
2922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei LiaoLinkerTest::LinkerTest()
3022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao{
3122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao}
3222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
3322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao// Destructor can do clean-up work that doesn't throw exceptions here.
3422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei LiaoLinkerTest::~LinkerTest()
3522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao{
3622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao}
3722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
3822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao// SetUp() will be called immediately before each test.
3922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaovoid LinkerTest::SetUp()
4022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao{
4122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao}
4222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
4322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao// TearDown() will be called immediately after each test.
4422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaovoid LinkerTest::TearDown()
4522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao{
4622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao}
4722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
4822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//===----------------------------------------------------------------------===//
4922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao// Testcases
5022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//===----------------------------------------------------------------------===//
5122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei LiaoTEST_F( LinkerTest, set_up_n_clean_up) {
5222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
5322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  Initialize();
5422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  LinkerConfig config("arm-none-linux-gnueabi");
55f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  LinkerScript script;
56f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  Module module("test", script);
5722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  config.setCodeGenType(LinkerConfig::DynObj);
5822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
5922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  Linker linker;
60f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  linker.emulate(script, config);
6122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
6222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  IRBuilder builder(module, config);
6322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  // create inputs here
6422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  //   builder.CreateInput("./test.o");
6522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
6622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  if (linker.link(module, builder))
6787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    linker.emit(module, "./test.so");
6822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
6922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  Finalize();
7022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao}
7122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
7222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao// %MCLinker --shared -soname=libplasma.so -Bsymbolic
7322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao// -mtriple="armv7-none-linux-gnueabi"
7422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao// -L=%p/../../../libs/ARM/Android/android-14
7522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao// %p/../../../libs/ARM/Android/android-14/crtbegin_so.o
7622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao// %p/plasma.o
7722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao// -lm -llog -ljnigraphics -lc
7822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao// %p/../../../libs/ARM/Android/android-14/crtend_so.o
7922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao// -o libplasma.so
8022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei LiaoTEST_F( LinkerTest, plasma) {
8122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
8222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  Initialize();
8322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  Linker linker;
84f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  LinkerScript script;
8522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
8622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  ///< --mtriple="armv7-none-linux-gnueabi"
8722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  LinkerConfig config("armv7-none-linux-gnueabi");
8822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
896f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  /// -L=${TOPDIR}/test/libs/ARM/Android/android-14
906f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  Path search_dir(TOPDIR);
916f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  search_dir.append("test/libs/ARM/Android/android-14");
92f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  script.directories().insert(search_dir);
936f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
9422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// To configure linker before setting options. Linker::config sets up
9522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// default target-dependent configuration to LinkerConfig.
96f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  linker.emulate(script, config);
9722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
9822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  config.setCodeGenType(LinkerConfig::DynObj);  ///< --shared
9922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  config.options().setSOName("libplasma.so");   ///< --soname=libplasma.so
10022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  config.options().setBsymbolic();              ///< -Bsymbolic
10122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
102f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  Module module("libplasma.so", script);
10322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  IRBuilder builder(module, config);
10422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
10522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// ${TOPDIR}/test/libs/ARM/Android/android-14/crtbegin_so.o
10622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  Path crtbegin(search_dir);
10722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  crtbegin.append("crtbegin_so.o");
10822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  builder.ReadInput("crtbegin", crtbegin);
10922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
11022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// ${TOPDIR}/test/Android/Plasma/ARM/plasma.o
11122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  Path plasma(TOPDIR);
11222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  plasma.append("test/Android/Plasma/ARM/plasma.o");
11322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  builder.ReadInput("plasma", plasma);
11422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
11522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  // -lm -llog -ljnigraphics -lc
11622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  builder.ReadInput("m");
11722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  builder.ReadInput("log");
11822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  builder.ReadInput("jnigraphics");
11922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  builder.ReadInput("c");
12022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
12122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// ${TOPDIR}/test/libs/ARM/Android/android-14/crtend_so.o
12222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  Path crtend(search_dir);
12322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  crtend.append("crtend_so.o");
12422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  builder.ReadInput("crtend", crtend);
12522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
12622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  if (linker.link(module, builder)) {
12787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    linker.emit(module, "libplasma.so"); ///< -o libplasma.so
12822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  }
12922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
13022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  Finalize();
13122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao}
13222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
13322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao// The outputs generated without -Bsymbolic usually have more relocation
13422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao// entries than the outputs generated with -Bsymbolic. This testcase generates
13522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao// output with -Bsymbolic first, then generate the same output without -Bsymbolic.
13622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao// By this way, we can make sure symbols and relocations are cleaned between
13722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao// two linkings.
13822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei LiaoTEST_F( LinkerTest, plasma_twice) {
13922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
14022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  Initialize();
14122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  Linker linker;
14222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
14322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  ///< --mtriple="armv7-none-linux-gnueabi"
14422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  LinkerConfig config1("armv7-none-linux-gnueabi");
14522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
146f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  LinkerScript script1;
1476f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  /// -L=${TOPDIR}/test/libs/ARM/Android/android-14
1486f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  Path search_dir(TOPDIR);
1496f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  search_dir.append("test/libs/ARM/Android/android-14");
150f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  script1.directories().insert(search_dir);
1516f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
15222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// To configure linker before setting options. Linker::config sets up
15322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// default target-dependent configuration to LinkerConfig.
154f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  linker.emulate(script1, config1);
15522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
15622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  config1.setCodeGenType(LinkerConfig::DynObj);  ///< --shared
15722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  config1.options().setSOName("libplasma.once.so");   ///< --soname=libplasma.twice.so
15822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  config1.options().setBsymbolic(false);              ///< -Bsymbolic
15922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
160f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  Module module1("libplasma.once.so", script1);
16122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  IRBuilder builder1(module1, config1);
16222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
16322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// ${TOPDIR}/test/libs/ARM/Android/android-14/crtbegin_so.o
16422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  Path crtbegin(search_dir);
16522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  crtbegin.append("crtbegin_so.o");
16622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  builder1.ReadInput("crtbegin", crtbegin);
16722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
16822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// ${TOPDIR}/test/Android/Plasma/ARM/plasma.o
16922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  Path plasma(TOPDIR);
17022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  plasma.append("test/Android/Plasma/ARM/plasma.o");
17122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  builder1.ReadInput("plasma", plasma);
17222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
17322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  // -lm -llog -ljnigraphics -lc
17422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  builder1.ReadInput("m");
17522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  builder1.ReadInput("log");
17622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  builder1.ReadInput("jnigraphics");
17722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  builder1.ReadInput("c");
17822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
17922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// ${TOPDIR}/test/libs/ARM/Android/android-14/crtend_so.o
18022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  Path crtend(search_dir);
18122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  crtend.append("crtend_so.o");
18222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  builder1.ReadInput("crtend", crtend);
18322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
18422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  if (linker.link(module1, builder1)) {
18587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    linker.emit(module1, "libplasma.once.so"); ///< -o libplasma.so
18622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  }
18722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
18822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  Finalize();
18922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
19022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  linker.reset();
19122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
19222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  Initialize();
19322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
19422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  ///< --mtriple="armv7-none-linux-gnueabi"
19522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  LinkerConfig config2("armv7-none-linux-gnueabi");
19622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
197f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  LinkerScript script2;
1986f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  /// -L=${TOPDIR}/test/libs/ARM/Android/android-14
199f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  script2.directories().insert(search_dir);
2006f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
20122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// To configure linker before setting options. Linker::config sets up
20222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// default target-dependent configuration to LinkerConfig.
203f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  linker.emulate(script2, config2);
20422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
20522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  config2.setCodeGenType(LinkerConfig::DynObj);  ///< --shared
20622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  config2.options().setSOName("libplasma.twice.so");   ///< --soname=libplasma.twice.exe
20722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  config2.options().setBsymbolic();              ///< -Bsymbolic
20822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
209f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  Module module2("libplasma.so", script2);
21022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  IRBuilder builder2(module2, config2);
21122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
21222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// ${TOPDIR}/test/libs/ARM/Android/android-14/crtbegin_so.o
21322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  builder2.ReadInput("crtbegin", crtbegin);
21422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
21522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// ${TOPDIR}/test/Android/Plasma/ARM/plasma.o
21622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  builder2.ReadInput("plasma", plasma);
21722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
21822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  // -lm -llog -ljnigraphics -lc
21922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  builder2.ReadInput("m");
22022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  builder2.ReadInput("log");
22122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  builder2.ReadInput("jnigraphics");
22222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  builder2.ReadInput("c");
22322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
22422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// ${TOPDIR}/test/libs/ARM/Android/android-14/crtend_so.o
22522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  builder2.ReadInput("crtend", crtend);
22622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
22722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  if (linker.link(module2, builder2)) {
22887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    linker.emit(module2, "libplasma.twice.so"); ///< -o libplasma.exe
22922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  }
23022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
23122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  Finalize();
23222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao}
23322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
23422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao// This testcase put IRBuilder in the heap
23522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei LiaoTEST_F( LinkerTest, plasma_twice_irbuilder_heap) {
23622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
23722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  Initialize();
23822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  Linker linker;
23922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
24022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  ///< --mtriple="armv7-none-linux-gnueabi"
24122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  LinkerConfig config1("armv7-none-linux-gnueabi");
24222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
243f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  LinkerScript script1;
2446f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  /// -L=${TOPDIR}/test/libs/ARM/Android/android-14
2456f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  Path search_dir(TOPDIR);
2466f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  search_dir.append("test/libs/ARM/Android/android-14");
247f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  script1.directories().insert(search_dir);
2486f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
24922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// To configure linker before setting options. Linker::config sets up
25022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// default target-dependent configuration to LinkerConfig.
251f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  linker.emulate(script1, config1);
25222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
25322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  config1.setCodeGenType(LinkerConfig::DynObj);  ///< --shared
25422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  config1.options().setSOName("libplasma.once.so");   ///< --soname=libplasma.twice.so
25522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  config1.options().setBsymbolic(false);              ///< -Bsymbolic
25622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
257f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  Module module1("libplasma.once.so", script1);
25822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  IRBuilder *builder1 = new IRBuilder(module1, config1);
25922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
26022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// ${TOPDIR}/test/libs/ARM/Android/android-14/crtbegin_so.o
26122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  Path crtbegin(search_dir);
26222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  crtbegin.append("crtbegin_so.o");
26322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  builder1->ReadInput("crtbegin", crtbegin);
26422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
26522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// ${TOPDIR}/test/Android/Plasma/ARM/plasma.o
26622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  Path plasma(TOPDIR);
26722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  plasma.append("test/Android/Plasma/ARM/plasma.o");
26822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  builder1->ReadInput("plasma", plasma);
26922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
27022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  // -lm -llog -ljnigraphics -lc
27122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  builder1->ReadInput("m");
27222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  builder1->ReadInput("log");
27322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  builder1->ReadInput("jnigraphics");
27422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  builder1->ReadInput("c");
27522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
27622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// ${TOPDIR}/test/libs/ARM/Android/android-14/crtend_so.o
27722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  Path crtend(search_dir);
27822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  crtend.append("crtend_so.o");
27922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  builder1->ReadInput("crtend", crtend);
28022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
28122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  if (linker.link(module1, *builder1)) {
28287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    linker.emit(module1, "libplasma.once.so"); ///< -o libplasma.so
28322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  }
28422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
28522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  // Can not delete builder until emit the output. Dynamic string table
28622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  // needs the file name of the input files, and the inputs' life is
28722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  // controlled by IRBuilder
28822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  delete builder1;
28922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
29022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  Finalize();
29122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
29222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  linker.reset();
29322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
29422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  Initialize();
29522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
29622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  ///< --mtriple="armv7-none-linux-gnueabi"
29722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  LinkerConfig config2("armv7-none-linux-gnueabi");
29822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
299f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  LinkerScript script2;
3006f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  /// -L=${TOPDIR}/test/libs/ARM/Android/android-14
301f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  script2.directories().insert(search_dir);
3026f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
30322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// To configure linker before setting options. Linker::config sets up
30422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// default target-dependent configuration to LinkerConfig.
305f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  linker.emulate(script2, config2);
30622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
30722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  config2.setCodeGenType(LinkerConfig::DynObj);  ///< --shared
30822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  config2.options().setSOName("libplasma.twice.so");   ///< --soname=libplasma.twice.exe
30922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  config2.options().setBsymbolic();              ///< -Bsymbolic
31022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
311f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  Module module2("libplasma.so", script2);
31222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  IRBuilder* builder2 = new IRBuilder(module2, config2);
31322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
31422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// ${TOPDIR}/test/libs/ARM/Android/android-14/crtbegin_so.o
31522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  builder2->ReadInput("crtbegin", crtbegin);
31622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
31722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// ${TOPDIR}/test/Android/Plasma/ARM/plasma.o
31822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  builder2->ReadInput("plasma", plasma);
31922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
32022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  // -lm -llog -ljnigraphics -lc
32122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  builder2->ReadInput("m");
32222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  builder2->ReadInput("log");
32322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  builder2->ReadInput("jnigraphics");
32422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  builder2->ReadInput("c");
32522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
32622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// ${TOPDIR}/test/libs/ARM/Android/android-14/crtend_so.o
32722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  builder2->ReadInput("crtend", crtend);
32822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
32922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  if (linker.link(module2, *builder2)) {
33087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    linker.emit(module2, "libplasma.twice.so"); ///< -o libplasma.exe
33122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  }
33222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
33322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  delete builder2;
33422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  Finalize();
33522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao}
33622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
33722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao// %MCLinker --shared -soname=libgotplt.so -mtriple arm-none-linux-gnueabi
33822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao// gotplt.o -o libgotplt.so
33922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei LiaoTEST_F( LinkerTest, plasma_object) {
34022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
34122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  Initialize();
34222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  Linker linker;
34322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
34422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  ///< --mtriple="armv7-none-linux-gnueabi"
34522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  LinkerConfig config("armv7-none-linux-gnueabi");
346f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  LinkerScript script;
34722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
34822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// To configure linker before setting options. Linker::config sets up
34922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// default target-dependent configuration to LinkerConfig.
350f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  linker.emulate(script, config);
35122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
35222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  config.setCodeGenType(LinkerConfig::DynObj);  ///< --shared
35322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  config.options().setSOName("libgotplt.so");   ///< --soname=libgotplt.so
35422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
355f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  Module module(script);
35622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  IRBuilder builder(module, config);
35722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
35822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  Path gotplt_o(TOPDIR);
35922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  gotplt_o.append("test/PLT/gotplt.o");
36022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  Input* input = builder.CreateInput("gotplt.o", gotplt_o, Input::Object);
36122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
362d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  /// Sections
36322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// [ 0]                   NULL            00000000 000000 000000 00      0   0  0
36422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  builder.CreateELFHeader(*input,
36522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                          "",
36622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                          LDFileFormat::Null,
36722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                          llvm::ELF::SHT_NULL,
36822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                          0x0);
36922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
37022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// [ 1] .text             PROGBITS        00000000 000034 000010 00  AX  0   0  4
37122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  LDSection* text = builder.CreateELFHeader(*input,
37222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                              ".text",
37322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                              llvm::ELF::SHT_PROGBITS,
37422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                              llvm::ELF::SHF_ALLOC | llvm::ELF::SHF_EXECINSTR,
37522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                              4);
37622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
37722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  SectionData* text_data = builder.CreateSectionData(*text);
37822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  static uint8_t text_content[] = { 0x00, 0x48, 0x2d, 0xe9,
37922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                                    0xfe, 0xff, 0xff, 0xeb,
38022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                                    0x00, 0x48, 0xbd, 0xe8,
38122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                                    0x0e, 0xf0, 0xa0, 0xe1 };
38222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  Fragment* text_frag = builder.CreateRegion(text_content, 0x10);
38322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  builder.AppendFragment(*text_frag, *text_data);
38422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
385d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  /// [ 2] .rel.text         REL             00000000 0002ac 000008 08      7   1  4
386d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  LDSection* rel_text = builder.CreateELFHeader(*input,
387d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao                          ".rel.text",
388d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao                          llvm::ELF::SHT_REL,
389d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao                          0x0, 4);
390d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  rel_text->setLink(text);
391d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  builder.CreateRelocData(*rel_text);
392d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao
393d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  /// [ 3] .data             PROGBITS        00000000 000044 000000 00  WA  0   0  4
394d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  LDSection* data = builder.CreateELFHeader(*input,
39522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                          ".data",
39622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                          llvm::ELF::SHT_PROGBITS,
39722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                          llvm::ELF::SHF_ALLOC | llvm::ELF::SHF_WRITE,
39822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                          4);
39922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
400d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  /// [ 4] .bss              NOBITS          00000000 000044 000000 00  WA  0   0  4
401d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  LDSection* bss = builder.CreateELFHeader(*input,
40222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                          ".bss",
403d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao                          llvm::ELF::SHT_NOBITS,
40422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                          llvm::ELF::SHF_ALLOC | llvm::ELF::SHF_WRITE,
40522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                          4);
406d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  builder.CreateBSS(*bss);
407d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao
408d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  /// [ 5] .ARM.attributes   ARM_ATTRIBUTES  00000000 000044 000020 00      0   0  1
40922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  LDSection* attr = builder.CreateELFHeader(*input,
41022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                              ".ARM.attributes",
41122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                              llvm::ELF::SHT_ARM_ATTRIBUTES,
41222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                              0x0,
413d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao                              1);
41422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
41522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  SectionData* attr_data = builder.CreateSectionData(*attr);
41622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  static uint8_t attr_content[] = {
41722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                      0x41, 0x1f, 0x00, 0x00,
41822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                      0x00, 0x61, 0x65, 0x61,
41922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                      0x62, 0x69, 0x00, 0x01,
42022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                      0x15, 0x00, 0x00, 0x00,
42122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                      0x06, 0x02, 0x08, 0x01,
42222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                      0x09, 0x01, 0x14, 0x01,
42322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                      0x15, 0x01, 0x17, 0x03,
42422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                      0x18, 0x01, 0x19, 0x01 };
42522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  Fragment* attr_frag = builder.CreateRegion(attr_content, 0x20);
42622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  builder.AppendFragment(*attr_frag, *attr_data);
42722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
428d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  /// Symbols
429d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  /// 1: 00000000     0 FILE    LOCAL  DEFAULT  ABS Output/gotplt.bc
430d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  builder.AddSymbol(*input,
431d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao                    "Output/gotplt.bc", ResolveInfo::File,
432d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao                    ResolveInfo::Define, ResolveInfo::Local, 0);
433551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  /// 2: 00000000     0 SECTION LOCAL  DEFAULT    1
434d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  builder.AddSymbol(*input,
435d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao                    ".text", ResolveInfo::Section,
436d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao                    ResolveInfo::Define, ResolveInfo::Local, 0, 0x0, text);
437d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  /// 3: 00000000     0 SECTION LOCAL  DEFAULT    3
438d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  builder.AddSymbol(*input,
439d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao                    ".data", ResolveInfo::Section,
440d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao                    ResolveInfo::Define, ResolveInfo::Local, 0, 0x0, data);
441551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  /// 4: 00000000     0 SECTION LOCAL  DEFAULT    4
442d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  builder.AddSymbol(*input,
443d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao                    ".bss", ResolveInfo::Section,
444d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao                    ResolveInfo::Define, ResolveInfo::Local, 0, 0x0, bss);
445551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  /// 5: 00000000     0 SECTION LOCAL  DEFAULT    5
446d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  builder.AddSymbol(*input,
447d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao                    ".ARM.attributes", ResolveInfo::Section,
448d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao                    ResolveInfo::Define, ResolveInfo::Local, 0, 0x0, attr);
449d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  /// 6: 00000000    16 FUNC    GLOBAL DEFAULT    1 _Z1fv
450d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  builder.AddSymbol(*input,
451d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao                    "_Z1fv", ResolveInfo::Function,
452d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao                    ResolveInfo::Define, ResolveInfo::Global,
453d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao                    16,
454d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao                    0x0,
455d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao                    text);
456d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao
457d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  /// 7: 00000000     0 NOTYPE  GLOBAL DEFAULT  UND _Z1gv
458d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  LDSymbol* z1gv = builder.AddSymbol(*input,
459d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao                                     "_Z1gv",
460d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao                                     ResolveInfo::NoType,
461d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao                                     ResolveInfo::Undefined,
462d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao                                     ResolveInfo::Global,
463d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao                                     0);
464d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao
465d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao /// Relocations
466d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao /// Offset     Info    Type            Sym.Value  Sym. Name
467d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao /// 00000004  0000071b R_ARM_PLT32       00000000   _Z1gv
468d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao builder.AddRelocation(*rel_text, llvm::ELF::R_ARM_PLT32, *z1gv, 0x4);
469d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao
47022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  if (linker.link(module, builder)) {
47187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    linker.emit(module, "libgotplt.so"); ///< -o libgotplt.so
47222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  }
47322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
47422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  Finalize();
47522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao}
476