Thank you so far, this got me (unsurprisingly) one step further, but
then the external function resolve error is moved to the library loading
stage:

~/afl++ $ g++-11 -Wl,-flat_namespace -Wl,-undefined,dynamic_lookup -g
-fPIC -std=c++11
-I/usr/local/Cellar/gcc/11.1.0_1/lib/gcc/11/gcc/x86_64-apple-darwin20/11.1.0/plugin/include
-I/usr/local/Cellar/gcc/11.1.0_1/lib/gcc/11/gcc/x86_64-apple-darwin20/11.1.0/plugin
-I/usr/local//Cellar/gmp/6.2.1/include -shared
instrumentation/afl-gcc-pass.so.cc -o afl-gcc-pass.so

=> compiles because the linker does not bail on functions it cannot
resolve at link time.

~/afl++ $ ./afl-gcc-fast -o test-instr test-instr.c
afl-cc ++3.15a by Michal Zalewski, Laszlo Szekeres, Marc Heuse - mode:
GCC_PLUGIN-DEFAULT
error: unable to load plugin './afl-gcc-pass.so':
'dlopen(./afl-gcc-pass.so, 9): Symbol not found:
__ZN8opt_pass14set_pass_paramEjb
  Referenced from: ./afl-gcc-pass.so
  Expected in: flat namespace
 in ./afl-gcc-pass.so'

Looking which library might be supplying this call does not show any
library:
~/afl++ $ egrep -ral __ZN8opt_pass14set_pass_paramEjb /usr/local/
/usr/local//var/homebrew/linked/gcc/libexec/gcc/x86_64-apple-darwin20/11.1.0/f951
/usr/local//opt/gcc@11/libexec/gcc/x86_64-apple-darwin20/11.1.0/f951
/usr/local//opt/gfortran/libexec/gcc/x86_64-apple-darwin20/11.1.0/f951
/usr/local//opt/gcc/libexec/gcc/x86_64-apple-darwin20/11.1.0/f951
/usr/local//Cellar/gcc/11.1.0_1/libexec/gcc/x86_64-apple-darwin20/11.1.0/f951

(on the other hand it is the same on Linux, I cannot find a library that
actually supplies that function.

Thank you!

Regards,
Marc


On 22.07.21 22:16, Iain Sandoe wrote:
> 
> 
>> On 22 Jul 2021, at 20:41, Andrew Pinski via Gcc <gcc@gcc.gnu.org> wrote:
>>
>> On Thu, Jul 22, 2021 at 7:37 AM Marc <m...@mh-sec.de> wrote:
>>>
> 
>>> I have a gcc plugin (for afl++,
>>> https://github.com/AFLplusplus/AFLplusplus) that works fine when
>>> compiled on Linux but when compiled on MacOS (brew install gcc) it fails:
>>>
>>> ~/afl++ $ g++-11 -g -fPIC -std=c++11
>>> -I/usr/local/Cellar/gcc/11.1.0_1/lib/gcc/11/gcc/x86_64-apple-darwin20/11.1.0/plugin/include
>>> -I/usr/local/Cellar/gcc/11.1.0_1/lib/gcc/11/gcc/x86_64-apple-darwin20/11.1.0/plugin
>>> -I/usr/local//Cellar/gmp/6.2.1/include -shared
>>> instrumentation/afl-gcc-pass.so.cc -o afl-gcc-pass.so
>>
>> A few things, You are not building the plugin with the correct options
>> for darwin.
>> Basically you need to allow undefined references
> 
> -Wl, -undefined, dynamic_lookup 
> 
> but if you expect those to bind to the main exe (e.g. cc1plus) at runtime, 
> then you will need to build that with dynamic export. (-export_dynamic)
> 
> These things will *not* transfer to arm64 macOS and they will probably 
> produce build warnings from newer linkers.
> 
> ===
> 
> I suspect that we will need to find a different recipe for that case 
> (possibly using the main exe as a "link library" on the plugin link line, I 
> guess).
> 
>> and then also use
>> dylib as the extension.
> 
> That’s a convention for shared libs but it won’t stop a plugin working (in 
> fact things like python use .so on macOS)
> 
>  for pluign modules, (e.g. Frameworks) even omitting the extension completely 
> has been done.
> 
> (so this is not the source of the problem)
> 
>> A few other things too.  I always forgot the exact options to use on
>> Darwin really.  GNU libtool can help with that.
> 
> perhaps, but I am not sure it’s maintained agressively .. so make sure to 
> check what you find is up to date.
> 
> cheers,
> Iain.
> 

-- 
Marc Heuse
www.mh-sec.de

PGP: AF3D 1D4C D810 F0BB 977D  3807 C7EE D0A0 6BE9 F573

Reply via email to