From 72ac67757015df21ca3469cdce0ed049120a7c4b Mon Sep 17 00:00:00 2001 From: inglorion Date: Sun, 17 Feb 2013 11:21:02 -0800 Subject: [PATCH] made variables in shared libraries work on i386 --- lib/voodoo/generators/amd64_nasm_generator.rb | 5 +++++ lib/voodoo/generators/i386_nasm_generator.rb | 18 ++++++++++++++++++ lib/voodoo/generators/nasm_generator.rb | 2 +- 3 files changed, 24 insertions(+), 1 deletion(-) diff --git a/lib/voodoo/generators/amd64_nasm_generator.rb b/lib/voodoo/generators/amd64_nasm_generator.rb index 9e9ff3d..309a448 100644 --- a/lib/voodoo/generators/amd64_nasm_generator.rb +++ b/lib/voodoo/generators/amd64_nasm_generator.rb @@ -294,6 +294,11 @@ module Voodoo end end + # Loads a symbol from the global offset table. + def load_symbol_from_got symbol, reg + "[rel #{symbol} wrt ..gotpc]" + end + # # == Miscellaneous # diff --git a/lib/voodoo/generators/i386_nasm_generator.rb b/lib/voodoo/generators/i386_nasm_generator.rb index 57c8bfe..69b29cc 100644 --- a/lib/voodoo/generators/i386_nasm_generator.rb +++ b/lib/voodoo/generators/i386_nasm_generator.rb @@ -79,6 +79,7 @@ module Voodoo @TEMPORARIES = [:ebx] super params @saved_registers = [] + in_section(:data) { emit "extern _GLOBAL_OFFSET_TABLE_\n" } @features.merge! \ :'bits-per-word' => '32', :'byte-order' => 'little-endian', @@ -111,6 +112,23 @@ module Voodoo end end + # Loads the address of the global offset table into the given register. + def load_got_address reg + lbl = gensym + emit "call #{lbl}\n" + emit "#{lbl}:\n" + emit "pop #{reg}\n" + emit "add #{reg}, _GLOBAL_OFFSET_TABLE_ + $$ - #{lbl} wrt ..gotpc\n" + reg + end + + # Loads a symbol from the global offset table. + def load_symbol_from_got symbol, reg + load_got_address reg + emit "mov #{reg}, [#{reg} + #{symbol} wrt ..got]\n" + reg + end + # If the nth local is stored in a register, returns that register. # Otherwise, returns the offset from the frame pointer. def local_offset_or_register n diff --git a/lib/voodoo/generators/nasm_generator.rb b/lib/voodoo/generators/nasm_generator.rb index bf46ed4..cb2a6a3 100644 --- a/lib/voodoo/generators/nasm_generator.rb +++ b/lib/voodoo/generators/nasm_generator.rb @@ -352,7 +352,7 @@ module Voodoo else # Assume global if @relocated_symbols.include? symbol - "[rel #{symbol} wrt ..gotpc]" + load_symbol_from_got symbol, reg else symbol end -- 2.11.4.GIT