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
1137b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Environment.h"
1237b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Module.h"
1337b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/InputTree.h"
1437b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/IRBuilder.h"
1537b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Linker.h"
1637b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/LinkerConfig.h"
1737b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/LinkerScript.h"
1822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
1937b74a387bb3993387029859c2d9d051c41c724eStephen Hines#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// Constructor can do set-up work for all test here.
2837b74a387bb3993387029859c2d9d051c41c724eStephen HinesLinkerTest::LinkerTest() {
2922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao}
3022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
3122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao// Destructor can do clean-up work that doesn't throw exceptions here.
3237b74a387bb3993387029859c2d9d051c41c724eStephen HinesLinkerTest::~LinkerTest() {
3322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao}
3422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
3522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao// SetUp() will be called immediately before each test.
3637b74a387bb3993387029859c2d9d051c41c724eStephen Hinesvoid LinkerTest::SetUp() {
3722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao}
3822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
3922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao// TearDown() will be called immediately after each test.
4037b74a387bb3993387029859c2d9d051c41c724eStephen Hinesvoid LinkerTest::TearDown() {
4122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao}
4222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
4322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//===----------------------------------------------------------------------===//
4422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao// Testcases
4522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//===----------------------------------------------------------------------===//
4637b74a387bb3993387029859c2d9d051c41c724eStephen HinesTEST_F(LinkerTest, set_up_n_clean_up) {
4722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  Initialize();
4822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  LinkerConfig config("arm-none-linux-gnueabi");
49f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  LinkerScript script;
50f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  Module module("test", script);
5122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  config.setCodeGenType(LinkerConfig::DynObj);
5222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
5322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  Linker linker;
54f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  linker.emulate(script, config);
5522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
5622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  IRBuilder builder(module, config);
5722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  // create inputs here
5822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  //   builder.CreateInput("./test.o");
5922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
6022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  if (linker.link(module, builder))
6187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    linker.emit(module, "./test.so");
6222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
6322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  Finalize();
6422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao}
6522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
6622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao// %MCLinker --shared -soname=libplasma.so -Bsymbolic
6722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao// -mtriple="armv7-none-linux-gnueabi"
6822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao// -L=%p/../../../libs/ARM/Android/android-14
6922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao// %p/../../../libs/ARM/Android/android-14/crtbegin_so.o
7022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao// %p/plasma.o
7122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao// -lm -llog -ljnigraphics -lc
7222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao// %p/../../../libs/ARM/Android/android-14/crtend_so.o
7322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao// -o libplasma.so
7437b74a387bb3993387029859c2d9d051c41c724eStephen HinesTEST_F(LinkerTest, plasma) {
7522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  Initialize();
7622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  Linker linker;
77f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  LinkerScript script;
7822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
7922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  ///< --mtriple="armv7-none-linux-gnueabi"
8022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  LinkerConfig config("armv7-none-linux-gnueabi");
8122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
826f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  /// -L=${TOPDIR}/test/libs/ARM/Android/android-14
836f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  Path search_dir(TOPDIR);
846f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  search_dir.append("test/libs/ARM/Android/android-14");
85f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  script.directories().insert(search_dir);
866f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
8722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// To configure linker before setting options. Linker::config sets up
8822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// default target-dependent configuration to LinkerConfig.
89f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  linker.emulate(script, config);
9022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
9122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  config.setCodeGenType(LinkerConfig::DynObj);  ///< --shared
9222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  config.options().setSOName("libplasma.so");   ///< --soname=libplasma.so
9322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  config.options().setBsymbolic();              ///< -Bsymbolic
9422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
95f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  Module module("libplasma.so", script);
9622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  IRBuilder builder(module, config);
9722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
9822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// ${TOPDIR}/test/libs/ARM/Android/android-14/crtbegin_so.o
9922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  Path crtbegin(search_dir);
10022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  crtbegin.append("crtbegin_so.o");
10122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  builder.ReadInput("crtbegin", crtbegin);
10222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
10322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// ${TOPDIR}/test/Android/Plasma/ARM/plasma.o
10422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  Path plasma(TOPDIR);
10522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  plasma.append("test/Android/Plasma/ARM/plasma.o");
10622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  builder.ReadInput("plasma", plasma);
10722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
10822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  // -lm -llog -ljnigraphics -lc
10922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  builder.ReadInput("m");
11022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  builder.ReadInput("log");
11122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  builder.ReadInput("jnigraphics");
11222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  builder.ReadInput("c");
11322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
11422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// ${TOPDIR}/test/libs/ARM/Android/android-14/crtend_so.o
11522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  Path crtend(search_dir);
11622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  crtend.append("crtend_so.o");
11722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  builder.ReadInput("crtend", crtend);
11822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
11922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  if (linker.link(module, builder)) {
12037b74a387bb3993387029859c2d9d051c41c724eStephen Hines    linker.emit(module, "libplasma.so");  ///< -o libplasma.so
12122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  }
12222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
12322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  Finalize();
12422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao}
12522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
12622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao// The outputs generated without -Bsymbolic usually have more relocation
12722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao// entries than the outputs generated with -Bsymbolic. This testcase generates
12837b74a387bb3993387029859c2d9d051c41c724eStephen Hines// output with -Bsymbolic first, then generate the same output without
12937b74a387bb3993387029859c2d9d051c41c724eStephen Hines// -Bsymbolic.
13022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao// By this way, we can make sure symbols and relocations are cleaned between
13122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao// two linkings.
13237b74a387bb3993387029859c2d9d051c41c724eStephen HinesTEST_F(LinkerTest, plasma_twice) {
13322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  Initialize();
13422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  Linker linker;
13522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
13622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  ///< --mtriple="armv7-none-linux-gnueabi"
13722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  LinkerConfig config1("armv7-none-linux-gnueabi");
13822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
139f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  LinkerScript script1;
1406f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  /// -L=${TOPDIR}/test/libs/ARM/Android/android-14
1416f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  Path search_dir(TOPDIR);
1426f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  search_dir.append("test/libs/ARM/Android/android-14");
143f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  script1.directories().insert(search_dir);
1446f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
14522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// To configure linker before setting options. Linker::config sets up
14622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// default target-dependent configuration to LinkerConfig.
147f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  linker.emulate(script1, config1);
14822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
14922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  config1.setCodeGenType(LinkerConfig::DynObj);  ///< --shared
15037b74a387bb3993387029859c2d9d051c41c724eStephen Hines  config1.options().setSOName(
15137b74a387bb3993387029859c2d9d051c41c724eStephen Hines      "libplasma.once.so");               ///< --soname=libplasma.twice.so
15237b74a387bb3993387029859c2d9d051c41c724eStephen Hines  config1.options().setBsymbolic(false);  ///< -Bsymbolic
15322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
154f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  Module module1("libplasma.once.so", script1);
15522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  IRBuilder builder1(module1, config1);
15622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
15722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// ${TOPDIR}/test/libs/ARM/Android/android-14/crtbegin_so.o
15822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  Path crtbegin(search_dir);
15922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  crtbegin.append("crtbegin_so.o");
16022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  builder1.ReadInput("crtbegin", crtbegin);
16122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
16222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// ${TOPDIR}/test/Android/Plasma/ARM/plasma.o
16322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  Path plasma(TOPDIR);
16422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  plasma.append("test/Android/Plasma/ARM/plasma.o");
16522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  builder1.ReadInput("plasma", plasma);
16622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
16722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  // -lm -llog -ljnigraphics -lc
16822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  builder1.ReadInput("m");
16922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  builder1.ReadInput("log");
17022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  builder1.ReadInput("jnigraphics");
17122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  builder1.ReadInput("c");
17222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
17322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// ${TOPDIR}/test/libs/ARM/Android/android-14/crtend_so.o
17422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  Path crtend(search_dir);
17522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  crtend.append("crtend_so.o");
17622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  builder1.ReadInput("crtend", crtend);
17722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
17822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  if (linker.link(module1, builder1)) {
17937b74a387bb3993387029859c2d9d051c41c724eStephen Hines    linker.emit(module1, "libplasma.once.so");  ///< -o libplasma.so
18022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  }
18122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
18222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  Finalize();
18322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
18422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  linker.reset();
18522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
18622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  Initialize();
18722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
18822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  ///< --mtriple="armv7-none-linux-gnueabi"
18922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  LinkerConfig config2("armv7-none-linux-gnueabi");
19022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
191f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  LinkerScript script2;
1926f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  /// -L=${TOPDIR}/test/libs/ARM/Android/android-14
193f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  script2.directories().insert(search_dir);
1946f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
19522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// To configure linker before setting options. Linker::config sets up
19622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// default target-dependent configuration to LinkerConfig.
197f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  linker.emulate(script2, config2);
19822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
19922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  config2.setCodeGenType(LinkerConfig::DynObj);  ///< --shared
20037b74a387bb3993387029859c2d9d051c41c724eStephen Hines  config2.options().setSOName(
20137b74a387bb3993387029859c2d9d051c41c724eStephen Hines      "libplasma.twice.so");         ///< --soname=libplasma.twice.exe
20237b74a387bb3993387029859c2d9d051c41c724eStephen Hines  config2.options().setBsymbolic();  ///< -Bsymbolic
20322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
204f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  Module module2("libplasma.so", script2);
20522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  IRBuilder builder2(module2, config2);
20622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
20722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// ${TOPDIR}/test/libs/ARM/Android/android-14/crtbegin_so.o
20822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  builder2.ReadInput("crtbegin", crtbegin);
20922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
21022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// ${TOPDIR}/test/Android/Plasma/ARM/plasma.o
21122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  builder2.ReadInput("plasma", plasma);
21222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
21322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  // -lm -llog -ljnigraphics -lc
21422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  builder2.ReadInput("m");
21522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  builder2.ReadInput("log");
21622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  builder2.ReadInput("jnigraphics");
21722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  builder2.ReadInput("c");
21822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
21922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// ${TOPDIR}/test/libs/ARM/Android/android-14/crtend_so.o
22022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  builder2.ReadInput("crtend", crtend);
22122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
22222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  if (linker.link(module2, builder2)) {
22337b74a387bb3993387029859c2d9d051c41c724eStephen Hines    linker.emit(module2, "libplasma.twice.so");  ///< -o libplasma.exe
22422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  }
22522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
22622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  Finalize();
22722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao}
22822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
22922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao// This testcase put IRBuilder in the heap
23037b74a387bb3993387029859c2d9d051c41c724eStephen HinesTEST_F(LinkerTest, plasma_twice_irbuilder_heap) {
23122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  Initialize();
23222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  Linker linker;
23322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
23422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  ///< --mtriple="armv7-none-linux-gnueabi"
23522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  LinkerConfig config1("armv7-none-linux-gnueabi");
23622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
237f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  LinkerScript script1;
2386f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  /// -L=${TOPDIR}/test/libs/ARM/Android/android-14
2396f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  Path search_dir(TOPDIR);
2406f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  search_dir.append("test/libs/ARM/Android/android-14");
241f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  script1.directories().insert(search_dir);
2426f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
24322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// To configure linker before setting options. Linker::config sets up
24422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// default target-dependent configuration to LinkerConfig.
245f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  linker.emulate(script1, config1);
24622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
24722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  config1.setCodeGenType(LinkerConfig::DynObj);  ///< --shared
24837b74a387bb3993387029859c2d9d051c41c724eStephen Hines  config1.options().setSOName(
24937b74a387bb3993387029859c2d9d051c41c724eStephen Hines      "libplasma.once.so");               ///< --soname=libplasma.twice.so
25037b74a387bb3993387029859c2d9d051c41c724eStephen Hines  config1.options().setBsymbolic(false);  ///< -Bsymbolic
25122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
252f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  Module module1("libplasma.once.so", script1);
25337b74a387bb3993387029859c2d9d051c41c724eStephen Hines  IRBuilder* builder1 = new IRBuilder(module1, config1);
25422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
25522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// ${TOPDIR}/test/libs/ARM/Android/android-14/crtbegin_so.o
25622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  Path crtbegin(search_dir);
25722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  crtbegin.append("crtbegin_so.o");
25822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  builder1->ReadInput("crtbegin", crtbegin);
25922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
26022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// ${TOPDIR}/test/Android/Plasma/ARM/plasma.o
26122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  Path plasma(TOPDIR);
26222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  plasma.append("test/Android/Plasma/ARM/plasma.o");
26322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  builder1->ReadInput("plasma", plasma);
26422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
26522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  // -lm -llog -ljnigraphics -lc
26622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  builder1->ReadInput("m");
26722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  builder1->ReadInput("log");
26822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  builder1->ReadInput("jnigraphics");
26922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  builder1->ReadInput("c");
27022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
27122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// ${TOPDIR}/test/libs/ARM/Android/android-14/crtend_so.o
27222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  Path crtend(search_dir);
27322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  crtend.append("crtend_so.o");
27422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  builder1->ReadInput("crtend", crtend);
27522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
27622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  if (linker.link(module1, *builder1)) {
27737b74a387bb3993387029859c2d9d051c41c724eStephen Hines    linker.emit(module1, "libplasma.once.so");  ///< -o libplasma.so
27822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  }
27922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
28022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  // Can not delete builder until emit the output. Dynamic string table
28122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  // needs the file name of the input files, and the inputs' life is
28222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  // controlled by IRBuilder
28322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  delete builder1;
28422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
28522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  Finalize();
28622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
28722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  linker.reset();
28822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
28922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  Initialize();
29022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
29122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  ///< --mtriple="armv7-none-linux-gnueabi"
29222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  LinkerConfig config2("armv7-none-linux-gnueabi");
29322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
294f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  LinkerScript script2;
2956f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  /// -L=${TOPDIR}/test/libs/ARM/Android/android-14
296f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  script2.directories().insert(search_dir);
2976f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
29822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// To configure linker before setting options. Linker::config sets up
29922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// default target-dependent configuration to LinkerConfig.
300f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  linker.emulate(script2, config2);
30122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
30222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  config2.setCodeGenType(LinkerConfig::DynObj);  ///< --shared
30337b74a387bb3993387029859c2d9d051c41c724eStephen Hines  config2.options().setSOName(
30437b74a387bb3993387029859c2d9d051c41c724eStephen Hines      "libplasma.twice.so");         ///< --soname=libplasma.twice.exe
30537b74a387bb3993387029859c2d9d051c41c724eStephen Hines  config2.options().setBsymbolic();  ///< -Bsymbolic
30622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
307f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  Module module2("libplasma.so", script2);
30822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  IRBuilder* builder2 = new IRBuilder(module2, config2);
30922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
31022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// ${TOPDIR}/test/libs/ARM/Android/android-14/crtbegin_so.o
31122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  builder2->ReadInput("crtbegin", crtbegin);
31222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
31322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// ${TOPDIR}/test/Android/Plasma/ARM/plasma.o
31422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  builder2->ReadInput("plasma", plasma);
31522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
31622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  // -lm -llog -ljnigraphics -lc
31722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  builder2->ReadInput("m");
31822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  builder2->ReadInput("log");
31922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  builder2->ReadInput("jnigraphics");
32022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  builder2->ReadInput("c");
32122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
32222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// ${TOPDIR}/test/libs/ARM/Android/android-14/crtend_so.o
32322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  builder2->ReadInput("crtend", crtend);
32422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
32522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  if (linker.link(module2, *builder2)) {
32637b74a387bb3993387029859c2d9d051c41c724eStephen Hines    linker.emit(module2, "libplasma.twice.so");  ///< -o libplasma.exe
32722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  }
32822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
32922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  delete builder2;
33022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  Finalize();
33122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao}
33222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
33322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao// %MCLinker --shared -soname=libgotplt.so -mtriple arm-none-linux-gnueabi
33422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao// gotplt.o -o libgotplt.so
33537b74a387bb3993387029859c2d9d051c41c724eStephen HinesTEST_F(LinkerTest, plasma_object) {
33622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  Initialize();
33722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  Linker linker;
33822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
33922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  ///< --mtriple="armv7-none-linux-gnueabi"
34022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  LinkerConfig config("armv7-none-linux-gnueabi");
341f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  LinkerScript script;
34222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
34322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// To configure linker before setting options. Linker::config sets up
34422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// default target-dependent configuration to LinkerConfig.
345f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  linker.emulate(script, config);
34622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
34722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  config.setCodeGenType(LinkerConfig::DynObj);  ///< --shared
34822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  config.options().setSOName("libgotplt.so");   ///< --soname=libgotplt.so
34922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
350f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  Module module(script);
35122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  IRBuilder builder(module, config);
35222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
35322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  Path gotplt_o(TOPDIR);
35422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  gotplt_o.append("test/PLT/gotplt.o");
35522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  Input* input = builder.CreateInput("gotplt.o", gotplt_o, Input::Object);
35622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
357d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  /// Sections
35837b74a387bb3993387029859c2d9d051c41c724eStephen Hines  /// [ 0]                   NULL            00000000 000000 000000 00      0
35937b74a387bb3993387029859c2d9d051c41c724eStephen Hines  /// 0  0
36037b74a387bb3993387029859c2d9d051c41c724eStephen Hines  builder.CreateELFHeader(
36137b74a387bb3993387029859c2d9d051c41c724eStephen Hines      *input, "", LDFileFormat::Null, llvm::ELF::SHT_NULL, 0x0);
36237b74a387bb3993387029859c2d9d051c41c724eStephen Hines
36337b74a387bb3993387029859c2d9d051c41c724eStephen Hines  /// [ 1] .text             PROGBITS        00000000 000034 000010 00  AX  0
36437b74a387bb3993387029859c2d9d051c41c724eStephen Hines  /// 0  4
36537b74a387bb3993387029859c2d9d051c41c724eStephen Hines  LDSection* text =
36637b74a387bb3993387029859c2d9d051c41c724eStephen Hines      builder.CreateELFHeader(*input,
36722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                              ".text",
36822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                              llvm::ELF::SHT_PROGBITS,
36922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                              llvm::ELF::SHF_ALLOC | llvm::ELF::SHF_EXECINSTR,
37022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                              4);
37122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
37222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  SectionData* text_data = builder.CreateSectionData(*text);
37337b74a387bb3993387029859c2d9d051c41c724eStephen Hines  static uint8_t text_content[] = {
37437b74a387bb3993387029859c2d9d051c41c724eStephen Hines      0x00, 0x48, 0x2d, 0xe9,
37537b74a387bb3993387029859c2d9d051c41c724eStephen Hines      0xfe, 0xff, 0xff, 0xeb,
37637b74a387bb3993387029859c2d9d051c41c724eStephen Hines      0x00, 0x48, 0xbd, 0xe8,
37737b74a387bb3993387029859c2d9d051c41c724eStephen Hines      0x0e, 0xf0, 0xa0, 0xe1
37837b74a387bb3993387029859c2d9d051c41c724eStephen Hines  };
37937b74a387bb3993387029859c2d9d051c41c724eStephen Hines
38022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  Fragment* text_frag = builder.CreateRegion(text_content, 0x10);
38122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  builder.AppendFragment(*text_frag, *text_data);
38222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
38337b74a387bb3993387029859c2d9d051c41c724eStephen Hines  /// [ 2] .rel.text         REL             00000000 0002ac 000008 08      7
38437b74a387bb3993387029859c2d9d051c41c724eStephen Hines  /// 1  4
38537b74a387bb3993387029859c2d9d051c41c724eStephen Hines  LDSection* rel_text =
38637b74a387bb3993387029859c2d9d051c41c724eStephen Hines      builder.CreateELFHeader(*input, ".rel.text", llvm::ELF::SHT_REL, 0x0, 4);
387d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  rel_text->setLink(text);
388d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  builder.CreateRelocData(*rel_text);
389d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao
39037b74a387bb3993387029859c2d9d051c41c724eStephen Hines  /// [ 3] .data             PROGBITS        00000000 000044 000000 00  WA  0
39137b74a387bb3993387029859c2d9d051c41c724eStephen Hines  /// 0  4
39237b74a387bb3993387029859c2d9d051c41c724eStephen Hines  LDSection* data =
39337b74a387bb3993387029859c2d9d051c41c724eStephen Hines      builder.CreateELFHeader(*input,
39437b74a387bb3993387029859c2d9d051c41c724eStephen Hines                              ".data",
39537b74a387bb3993387029859c2d9d051c41c724eStephen Hines                              llvm::ELF::SHT_PROGBITS,
39637b74a387bb3993387029859c2d9d051c41c724eStephen Hines                              llvm::ELF::SHF_ALLOC | llvm::ELF::SHF_WRITE,
39737b74a387bb3993387029859c2d9d051c41c724eStephen Hines                              4);
39837b74a387bb3993387029859c2d9d051c41c724eStephen Hines
39937b74a387bb3993387029859c2d9d051c41c724eStephen Hines  /// [ 4] .bss              NOBITS          00000000 000044 000000 00  WA  0
40037b74a387bb3993387029859c2d9d051c41c724eStephen Hines  /// 0  4
40137b74a387bb3993387029859c2d9d051c41c724eStephen Hines  LDSection* bss =
40237b74a387bb3993387029859c2d9d051c41c724eStephen Hines      builder.CreateELFHeader(*input,
40337b74a387bb3993387029859c2d9d051c41c724eStephen Hines                              ".bss",
40437b74a387bb3993387029859c2d9d051c41c724eStephen Hines                              llvm::ELF::SHT_NOBITS,
40537b74a387bb3993387029859c2d9d051c41c724eStephen Hines                              llvm::ELF::SHF_ALLOC | llvm::ELF::SHF_WRITE,
40637b74a387bb3993387029859c2d9d051c41c724eStephen Hines                              4);
407d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  builder.CreateBSS(*bss);
408d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao
40937b74a387bb3993387029859c2d9d051c41c724eStephen Hines  /// [ 5] .ARM.attributes   ARM_ATTRIBUTES  00000000 000044 000020 00      0
41037b74a387bb3993387029859c2d9d051c41c724eStephen Hines  /// 0  1
41137b74a387bb3993387029859c2d9d051c41c724eStephen Hines  LDSection* attr = builder.CreateELFHeader(
41237b74a387bb3993387029859c2d9d051c41c724eStephen Hines      *input, ".ARM.attributes", llvm::ELF::SHT_ARM_ATTRIBUTES, 0x0, 1);
41322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
41422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  SectionData* attr_data = builder.CreateSectionData(*attr);
41522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  static uint8_t attr_content[] = {
41637b74a387bb3993387029859c2d9d051c41c724eStephen Hines      0x41, 0x1f, 0x00, 0x00,
41737b74a387bb3993387029859c2d9d051c41c724eStephen Hines      0x00, 0x61, 0x65, 0x61,
41837b74a387bb3993387029859c2d9d051c41c724eStephen Hines      0x62, 0x69, 0x00, 0x01,
41937b74a387bb3993387029859c2d9d051c41c724eStephen Hines      0x15, 0x00, 0x00, 0x00,
42037b74a387bb3993387029859c2d9d051c41c724eStephen Hines      0x06, 0x02, 0x08, 0x01,
42137b74a387bb3993387029859c2d9d051c41c724eStephen Hines      0x09, 0x01, 0x14, 0x01,
42237b74a387bb3993387029859c2d9d051c41c724eStephen Hines      0x15, 0x01, 0x17, 0x03,
42337b74a387bb3993387029859c2d9d051c41c724eStephen Hines      0x18, 0x01, 0x19, 0x01
42437b74a387bb3993387029859c2d9d051c41c724eStephen Hines  };
42537b74a387bb3993387029859c2d9d051c41c724eStephen Hines
42622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  Fragment* attr_frag = builder.CreateRegion(attr_content, 0x20);
42722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  builder.AppendFragment(*attr_frag, *attr_data);
42822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
429d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  /// Symbols
430d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  /// 1: 00000000     0 FILE    LOCAL  DEFAULT  ABS Output/gotplt.bc
431d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  builder.AddSymbol(*input,
43237b74a387bb3993387029859c2d9d051c41c724eStephen Hines                    "Output/gotplt.bc",
43337b74a387bb3993387029859c2d9d051c41c724eStephen Hines                    ResolveInfo::File,
43437b74a387bb3993387029859c2d9d051c41c724eStephen Hines                    ResolveInfo::Define,
43537b74a387bb3993387029859c2d9d051c41c724eStephen Hines                    ResolveInfo::Local,
43637b74a387bb3993387029859c2d9d051c41c724eStephen Hines                    0);
437551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  /// 2: 00000000     0 SECTION LOCAL  DEFAULT    1
438d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  builder.AddSymbol(*input,
43937b74a387bb3993387029859c2d9d051c41c724eStephen Hines                    ".text",
44037b74a387bb3993387029859c2d9d051c41c724eStephen Hines                    ResolveInfo::Section,
44137b74a387bb3993387029859c2d9d051c41c724eStephen Hines                    ResolveInfo::Define,
44237b74a387bb3993387029859c2d9d051c41c724eStephen Hines                    ResolveInfo::Local,
44337b74a387bb3993387029859c2d9d051c41c724eStephen Hines                    0,
44437b74a387bb3993387029859c2d9d051c41c724eStephen Hines                    0x0,
44537b74a387bb3993387029859c2d9d051c41c724eStephen Hines                    text);
446d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  /// 3: 00000000     0 SECTION LOCAL  DEFAULT    3
447d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  builder.AddSymbol(*input,
44837b74a387bb3993387029859c2d9d051c41c724eStephen Hines                    ".data",
44937b74a387bb3993387029859c2d9d051c41c724eStephen Hines                    ResolveInfo::Section,
45037b74a387bb3993387029859c2d9d051c41c724eStephen Hines                    ResolveInfo::Define,
45137b74a387bb3993387029859c2d9d051c41c724eStephen Hines                    ResolveInfo::Local,
45237b74a387bb3993387029859c2d9d051c41c724eStephen Hines                    0,
45337b74a387bb3993387029859c2d9d051c41c724eStephen Hines                    0x0,
45437b74a387bb3993387029859c2d9d051c41c724eStephen Hines                    data);
455551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  /// 4: 00000000     0 SECTION LOCAL  DEFAULT    4
456d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  builder.AddSymbol(*input,
45737b74a387bb3993387029859c2d9d051c41c724eStephen Hines                    ".bss",
45837b74a387bb3993387029859c2d9d051c41c724eStephen Hines                    ResolveInfo::Section,
45937b74a387bb3993387029859c2d9d051c41c724eStephen Hines                    ResolveInfo::Define,
46037b74a387bb3993387029859c2d9d051c41c724eStephen Hines                    ResolveInfo::Local,
46137b74a387bb3993387029859c2d9d051c41c724eStephen Hines                    0,
46237b74a387bb3993387029859c2d9d051c41c724eStephen Hines                    0x0,
46337b74a387bb3993387029859c2d9d051c41c724eStephen Hines                    bss);
464551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  /// 5: 00000000     0 SECTION LOCAL  DEFAULT    5
465d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  builder.AddSymbol(*input,
46637b74a387bb3993387029859c2d9d051c41c724eStephen Hines                    ".ARM.attributes",
46737b74a387bb3993387029859c2d9d051c41c724eStephen Hines                    ResolveInfo::Section,
46837b74a387bb3993387029859c2d9d051c41c724eStephen Hines                    ResolveInfo::Define,
46937b74a387bb3993387029859c2d9d051c41c724eStephen Hines                    ResolveInfo::Local,
47037b74a387bb3993387029859c2d9d051c41c724eStephen Hines                    0,
47137b74a387bb3993387029859c2d9d051c41c724eStephen Hines                    0x0,
47237b74a387bb3993387029859c2d9d051c41c724eStephen Hines                    attr);
473d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  /// 6: 00000000    16 FUNC    GLOBAL DEFAULT    1 _Z1fv
474d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  builder.AddSymbol(*input,
47537b74a387bb3993387029859c2d9d051c41c724eStephen Hines                    "_Z1fv",
47637b74a387bb3993387029859c2d9d051c41c724eStephen Hines                    ResolveInfo::Function,
47737b74a387bb3993387029859c2d9d051c41c724eStephen Hines                    ResolveInfo::Define,
47837b74a387bb3993387029859c2d9d051c41c724eStephen Hines                    ResolveInfo::Global,
479d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao                    16,
480d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao                    0x0,
481d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao                    text);
482d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao
483d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  /// 7: 00000000     0 NOTYPE  GLOBAL DEFAULT  UND _Z1gv
484d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  LDSymbol* z1gv = builder.AddSymbol(*input,
485d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao                                     "_Z1gv",
486d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao                                     ResolveInfo::NoType,
487d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao                                     ResolveInfo::Undefined,
488d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao                                     ResolveInfo::Global,
489d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao                                     0);
490d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao
49137b74a387bb3993387029859c2d9d051c41c724eStephen Hines  /// Relocations
49237b74a387bb3993387029859c2d9d051c41c724eStephen Hines  /// Offset     Info    Type            Sym.Value  Sym. Name
49337b74a387bb3993387029859c2d9d051c41c724eStephen Hines  /// 00000004  0000071b R_ARM_PLT32       00000000   _Z1gv
49437b74a387bb3993387029859c2d9d051c41c724eStephen Hines  builder.AddRelocation(*rel_text, llvm::ELF::R_ARM_PLT32, *z1gv, 0x4);
495d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao
49622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  if (linker.link(module, builder)) {
49737b74a387bb3993387029859c2d9d051c41c724eStephen Hines    linker.emit(module, "libgotplt.so");  ///< -o libgotplt.so
49822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  }
49922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
50022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  Finalize();
50122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao}
502