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