How can we test if emscripten supports a function?

27 views
Skip to first unread message

Mehdi Sabwat

unread,
Aug 12, 2019, 10:46:34 AM8/12/19
to emscripten-discuss
Hi,

I am trying to cross-compile ffmpeg, and I have an issue with:

sched_getaffinity (undefined symbol)

eventhough the test succeeds:
Enter code here...check_func sched_getaffinity
test_ld cc
test_cc
BEGIN /tmp/ffconf.PhRaCAYu/test.c
   
1   extern int sched_getaffinity();
   
2   int main(void){ sched_getaffinity(); }
END /tmp/ffconf.PhRaCAYu/test.c
emcc
-I/home/b1ue/b1ue/workdir_vlc/vlc/contrib/wasm32-unknown-emscripten/include -D_ISOC99_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -D_POSIX_C_SOURCE=200112 -D_\
XOPEN_SOURCE
=600 -I/home/b1ue/b1ue/workdir_vlc/vlc/contrib/wasm32-unknown-emscripten/include -g -O2 -s USE_PTHREADS=1 -std=c11 -fomit-frame-pointer -c -o /tmp/ffconf.PhR\
aCAYu
/test.o /tmp/ffconf.PhRaCAYu/test.c
emcc
-L/home/b1ue/b1ue/workdir_vlc/vlc/contrib/wasm32-unknown-emscripten/lib -L/home/b1ue/b1ue/workdir_vlc/vlc/contrib/wasm32-unknown-emscripten/lib -Wl,--as-needed -Wl,\
-z,noexecstack -o /tmp/ffconf.PhRaCAYu/test /tmp/ffconf.PhRaCAYu/test.o


I have this test that is giving me weird results.

main.c:
extern int  foo();
//int  foo();
main
()
{
  foo
();
 
return 0;
}

this code compiles with:
emcc main.c -o main

it shouldn't because this function was never defined. We would think it is because in the first example we compiled with -c and then linked (which works the same, ie. doesn't give any error), but I have a case where the configure test does not use -c and fails.

example :
configure:45053: checking for shmat
configure:45053: emcc -o conftest -g -O2  -Werror=unknown-warning-option -Werror=invalid-command-line-argument -D__NEED_ssize_t -s USE_PTHREADS=1 -I/home/b1ue/vlc/vlc/co\
ntrib
/wasm32-unknown-emscripten/include -Wall -Wextra -Wsign-compare -Wundef -Wpointer-arith -Wvolatile-register-var -Wformat -Wformat-security -Wbad-function-cast -Wwri\
te
-strings -Wmissing-prototypes -Werror-implicit-function-declaration -Winit-self -pipe -fvisibility=hidden -fno-math-errno -funsafe-math-optimizations -funroll-loops  -\
I
/home/b1ue/vlc/vlc/contrib/wasm32-unknown-emscripten/include  -L/home/b1ue/vlc/vlc/contrib/wasm32-unknown-emscripten/lib -Wl,-z,defs conftest.c  >&5
emscripten
:warning: Wasm source map won't be usable in a browser without --source-map-base
error: undefined symbol: shmat
warning: To disable errors for undefined symbols use `-s ERROR_ON_UNDEFINED_SYMBOLS=0`
Error: Aborting compilation due to previous errors
shared:ERROR: '
/home/b1ue/b1ue/workdir_vlc/emsdk/node/8.9.1_64bit/bin/node /home/b1ue/b1ue/workdir_vlc/emsdk/upstream/emscripten/src/compiler.js /tmp/tmppnm5jpew.txt /ho\
me
/b1ue/b1ue/workdir_vlc/emsdk/upstream/emscripten/src/library_pthread.js' failed (1)
configure:45053: $? = 1

thank you

Alon Zakai

unread,
Aug 12, 2019, 4:42:37 PM8/12/19
to emscripte...@googlegroups.com
The issue is that

emcc main.c -o main

will emit an object file to main. This behavior is different than clang and gcc, as emcc uses the suffix to decide what to emit: if it sees -o main.js it will link to JS, and would error on the missing foo. But without a recognizable suffix it emits an object file, and then there is no link error.

This can be confusing and perhaps we should make it more standard (the original reasons behind it are probably no longer relevant). Meanwhile, the workaround is to do such tests with -o main.o (specifying a suffix).

- Alon


--
You received this message because you are subscribed to the Google Groups "emscripten-discuss" group.
To unsubscribe from this group and stop receiving emails from it, send an email to emscripten-disc...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/emscripten-discuss/6b383a65-2f51-4830-939f-9d7afb1285ef%40googlegroups.com.

Mehdi Sabwat

unread,
Aug 13, 2019, 12:03:03 PM8/13/19
to emscripten-discuss
Thanks Alon !

-o main.o is the same as -o main, but we can test with -o *.js
To unsubscribe from this group and stop receiving emails from it, send an email to emscripten-discuss+unsub...@googlegroups.com.
Reply all
Reply to author
Forward
0 new messages