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