This should only be called during finish because it creates symbols for missing libcalls.
(&mut self, name: &ModuleRelocTarget)
| 758 | /// This should only be called during finish because it creates |
| 759 | /// symbols for missing libcalls. |
| 760 | fn get_symbol(&mut self, name: &ModuleRelocTarget) -> SymbolId { |
| 761 | match *name { |
| 762 | ModuleRelocTarget::User { .. } => { |
| 763 | if ModuleDeclarations::is_function(name) { |
| 764 | let id = FuncId::from_name(name); |
| 765 | self.functions[id].unwrap().0 |
| 766 | } else { |
| 767 | let id = DataId::from_name(name); |
| 768 | self.data_objects[id].unwrap().0 |
| 769 | } |
| 770 | } |
| 771 | ModuleRelocTarget::LibCall(ref libcall) => { |
| 772 | let name = (self.libcall_names)(*libcall); |
| 773 | if let Some(symbol) = self.object.symbol_id(name.as_bytes()) { |
| 774 | symbol |
| 775 | } else if let Some(symbol) = self.libcalls.get(libcall) { |
| 776 | *symbol |
| 777 | } else { |
| 778 | let symbol = self.object.add_symbol(Symbol { |
| 779 | name: name.as_bytes().to_vec(), |
| 780 | value: 0, |
| 781 | size: 0, |
| 782 | kind: SymbolKind::Text, |
| 783 | scope: SymbolScope::Unknown, |
| 784 | weak: false, |
| 785 | section: SymbolSection::Undefined, |
| 786 | flags: SymbolFlags::None, |
| 787 | }); |
| 788 | self.libcalls.insert(*libcall, symbol); |
| 789 | symbol |
| 790 | } |
| 791 | } |
| 792 | // These are "magic" names well-known to the linker. |
| 793 | // They require special treatment. |
| 794 | ModuleRelocTarget::KnownSymbol(ref known_symbol) => { |
| 795 | if let Some(symbol) = self.known_symbols.get(known_symbol) { |
| 796 | *symbol |
| 797 | } else { |
| 798 | let symbol = self.object.add_symbol(match known_symbol { |
| 799 | ir::KnownSymbol::ElfGlobalOffsetTable => Symbol { |
| 800 | name: b"_GLOBAL_OFFSET_TABLE_".to_vec(), |
| 801 | value: 0, |
| 802 | size: 0, |
| 803 | kind: SymbolKind::Data, |
| 804 | scope: SymbolScope::Unknown, |
| 805 | weak: false, |
| 806 | section: SymbolSection::Undefined, |
| 807 | flags: SymbolFlags::None, |
| 808 | }, |
| 809 | ir::KnownSymbol::CoffTlsIndex => Symbol { |
| 810 | name: b"_tls_index".to_vec(), |
| 811 | value: 0, |
| 812 | size: 32, |
| 813 | kind: SymbolKind::Tls, |
| 814 | scope: SymbolScope::Unknown, |
| 815 | weak: false, |
| 816 | section: SymbolSection::Undefined, |
| 817 | flags: SymbolFlags::None, |