pts / pts-tcc

tiny, self-contained C compiler using TCC + uClibc
17 stars 0 forks source link

undefined reference to __rawmemchr #1

Closed bkauler closed 6 years ago

bkauler commented 6 years ago

Hi, I am trying to compile pts-tcc, almost get there!

I am using uclibc-ng, the latest from git repo. That's really the only difference. uclibc version 0.9.30.1 would not compile.

When I run 'pts-tcc-0.9.26-compile.sh', it generates 'i386-uclibc-gcc' ok, which works. However, the script stops here:

+ cd tcc-0.9.26
+ /mnt/sdb1/downloads/input508/pts-tcc/i386-uclibc-gcc -static -o ../pts-tcc.uncompressed tcc.c libtcc.c tccelf.c tccgen.c tccpp.c i386-gen.c tccrun.c tccasm.c i386-asm.c libcdata.s -DTCC_TARGET_I386 -O2 -s -Wall -fno-strict-aliasing -mpreferred-stack-boundary=2 -march=i386 -falign-functions=0 -Wno-pointer-sign -Wno-sign-compare -lm -DCONFIG_TCC_STATIC -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=0
tccgen.c: In function ‘expr_cond’:
tccgen.c:4131:17: warning: this ‘else’ clause does not guard... [-Wmisleading-indentation]
                 else
                 ^~~~
tccgen.c:4133:21: note: ...this statement, but the latter is misleadingly indented as if it is guarded by the ‘else’
                     gv(rc);
                     ^~
/usr/i386-linux-uclibc/usr//lib/libc.a(libdl.os): In function `dlopen':
libdl.c:(.text.dlopen+0x0): multiple definition of `dlopen'
/tmp/ccFvJUEu.o:tccrun.c:(.text+0x820): first defined here
/usr/i386-linux-uclibc/usr//lib/libc.a(libdl.os): In function `dlclose':
libdl.c:(.text.dlclose+0x0): multiple definition of `dlclose'
/tmp/ccFvJUEu.o:tccrun.c:(.text+0x824): first defined here
/usr/i386-linux-uclibc/usr//lib/libc.a(libdl.os): In function `dlerror':
libdl.c:(.text.dlerror+0x0): multiple definition of `dlerror'
/tmp/ccFvJUEu.o:tccrun.c:(.text+0x828): first defined here
/tmp/ccwy98z9.o: In function `tcc_basename':
libtcc.c:(.text+0x329): undefined reference to `__rawmemchr'
/tmp/ccwy98z9.o: In function `tcc_fileextension':
libtcc.c:(.text+0x352): undefined reference to `__rawmemchr'
libtcc.c:(.text+0x380): undefined reference to `__rawmemchr'
collect2: error: ld returned 1 exit status
+ exit 1

I can compile a simple "Hello World":

# ./i386-uclibc-gcc -o hello hello.c
# ./hello
Hello, World!# 
# ldd ./hello
    libc.so.0 => /usr/i386-linux-uclibc/lib//libc.so.0 (0xb7e86000)
    ld-uClibc.so.1 => /usr/i386-linux-uclibc/lib/ld-uClibc.so.0 (0xb7f6e000)
# 

Do you have any thoughts about the cause of the error? '__rawmemchr' is defined in uclibc both 0.9.30.1 and latest uclibc-ng:

# grep '__rawmemchr' `find . -type f`
./libc/string/generic/strtok_r.c:# define __rawmemchr rawmemchr
./libc/string/generic/strtok_r.c:# define __rawmemchr strchr
./libc/string/generic/strtok_r.c:    *save_ptr = __rawmemchr (token, '\0');
# 

...so I don't understand why the error.

bkauler commented 6 years ago

If anyone wants to reproduce my situation exactly, I got uclibc-ng 1.0.30 from here:

https://downloads.uclibc-ng.org/releases/

My .config file:

#
# Automatically generated file; DO NOT EDIT.
# uClibc-ng 1.0.30 C Library Configuration
#
# TARGET_aarch64 is not set
# TARGET_alpha is not set
# TARGET_arc is not set
# TARGET_arm is not set
# TARGET_avr32 is not set
# TARGET_bfin is not set
# TARGET_c6x is not set
# TARGET_cris is not set
# TARGET_csky is not set
# TARGET_frv is not set
# TARGET_h8300 is not set
# TARGET_hppa is not set
TARGET_i386=y
# TARGET_ia64 is not set
# TARGET_lm32 is not set
# TARGET_m68k is not set
# TARGET_metag is not set
# TARGET_microblaze is not set
# TARGET_mips is not set
# TARGET_nds32 is not set
# TARGET_nios2 is not set
# TARGET_or1k is not set
# TARGET_powerpc is not set
# TARGET_sh is not set
# TARGET_sparc is not set
# TARGET_sparc64 is not set
# TARGET_tile is not set
# TARGET_x86_64 is not set
# TARGET_xtensa is not set

#
# Target Architecture Features and Options
#
TARGET_ARCH="i386"
FORCE_OPTIONS_FOR_ARCH=y
# CONFIG_386 is not set
# CONFIG_486 is not set
# CONFIG_586 is not set
CONFIG_686=y
TARGET_SUBARCH="i686"

#
# Using ELF file format
#
ARCH_HAS_DEPRECATED_SYSCALLS=y
ARCH_LITTLE_ENDIAN=y

#
# Using Little Endian
#
ARCH_HAS_MMU=y
ARCH_USE_MMU=y
UCLIBC_HAS_FLOATS=y
UCLIBC_HAS_FPU=y
DO_C99_MATH=y
DO_XSI_MATH=y
UCLIBC_HAS_FENV=y
UCLIBC_HAS_LONG_DOUBLE_MATH=y
KERNEL_HEADERS="/usr/include"
HAVE_DOT_CONFIG=y

#
# General Library Settings
#
DOPIC=y
ARCH_HAS_UCONTEXT=y
HAVE_SHARED=y
FORCE_SHAREABLE_TEXT_SEGMENTS=y
LDSO_LDD_SUPPORT=y
LDSO_CACHE_SUPPORT=y
LDSO_PRELOAD_ENV_SUPPORT=y
LDSO_PRELOAD_FILE_SUPPORT=y
LDSO_BASE_FILENAME="ld.so"
LDSO_STANDALONE_SUPPORT=y
LDSO_PRELINK_SUPPORT=y
UCLIBC_STATIC_LDCONFIG=y
LDSO_RUNPATH=y
LDSO_RUNPATH_OF_EXECUTABLE=y
LDSO_SAFE_RUNPATH=y
LDSO_SEARCH_INTERP_PATH=y
LDSO_LD_LIBRARY_PATH=y
UCLIBC_CTOR_DTOR=y
LDSO_GNU_HASH_SUPPORT=y
# HAS_NO_THREADS is not set
# UCLIBC_HAS_LINUXTHREADS is not set
UCLIBC_HAS_THREADS_NATIVE=y
UCLIBC_HAS_THREADS=y
UCLIBC_HAS_TLS=y
PTHREADS_DEBUG_SUPPORT=y
UCLIBC_HAS_SYSLOG=y
UCLIBC_HAS_LFS=y
# MALLOC is not set
# MALLOC_SIMPLE is not set
MALLOC_STANDARD=y
UCLIBC_DYNAMIC_ATEXIT=y
UCLIBC_HAS_UTMPX=y
UCLIBC_HAS_UTMP=y
UCLIBC_SUSV2_LEGACY=y
UCLIBC_SUSV3_LEGACY=y
UCLIBC_HAS_CONTEXT_FUNCS=y
UCLIBC_SUSV3_LEGACY_MACROS=y
UCLIBC_SUSV4_LEGACY=y
# UCLIBC_STRICT_HEADERS is not set
UCLIBC_HAS_STUBS=y
UCLIBC_HAS_SHADOW=y
UCLIBC_HAS_PROGRAM_INVOCATION_NAME=y
UCLIBC_HAS___PROGNAME=y
UCLIBC_HAS_PTY=y
ASSUME_DEVPTS=y
UNIX98PTY_ONLY=y
UCLIBC_HAS_GETPT=y
UCLIBC_HAS_LIBUTIL=y
UCLIBC_HAS_TM_EXTENSIONS=y
UCLIBC_HAS_TZ_CACHING=y
UCLIBC_HAS_TZ_FILE=y
UCLIBC_HAS_TZ_FILE_READ_MANY=y
UCLIBC_TZ_FILE_PATH="/etc/TZ"
UCLIBC_FALLBACK_TO_ETC_LOCALTIME=y

#
# Advanced Library Settings
#
UCLIBC_PWD_BUFFER_SIZE=256
UCLIBC_GRP_BUFFER_SIZE=256

#
# Support various families of functions
#
UCLIBC_LINUX_SPECIFIC=y
UCLIBC_HAS_GNU_ERROR=y
UCLIBC_BSD_SPECIFIC=y
UCLIBC_HAS_BSD_ERR=y
UCLIBC_HAS_OBSOLETE_BSD_SIGNAL=y
# UCLIBC_HAS_OBSOLETE_SYSV_SIGNAL is not set
UCLIBC_NTP_LEGACY=y
# UCLIBC_SV4_DEPRECATED is not set
UCLIBC_HAS_REALTIME=y
UCLIBC_HAS_ADVANCED_REALTIME=y
UCLIBC_HAS_EPOLL=y
UCLIBC_HAS_XATTR=y
UCLIBC_HAS_PROFILING=y
UCLIBC_HAS_CRYPT_IMPL=y
UCLIBC_HAS_SHA256_CRYPT_IMPL=y
UCLIBC_HAS_SHA512_CRYPT_IMPL=y
UCLIBC_HAS_CRYPT=y
UCLIBC_HAS_NETWORK_SUPPORT=y
UCLIBC_HAS_SOCKET=y
UCLIBC_HAS_IPV4=y
UCLIBC_HAS_IPV6=y
UCLIBC_USE_NETLINK=y
UCLIBC_SUPPORT_AI_ADDRCONFIG=y
UCLIBC_HAS_BSD_RES_CLOSE=y
UCLIBC_HAS_COMPAT_RES_STATE=y
UCLIBC_HAS_EXTRA_COMPAT_RES_STATE=y
UCLIBC_HAS_RESOLVER_SUPPORT=y

#
# String and Stdio Support
#
UCLIBC_HAS_STRING_GENERIC_OPT=y
UCLIBC_HAS_STRING_ARCH_OPT=y
UCLIBC_HAS_STDIO_FUTEXES=y
UCLIBC_HAS_CTYPE_TABLES=y
UCLIBC_HAS_CTYPE_SIGNED=y
# UCLIBC_HAS_CTYPE_UNSAFE is not set
UCLIBC_HAS_CTYPE_CHECKED=y
# UCLIBC_HAS_CTYPE_ENFORCED is not set
UCLIBC_HAS_WCHAR=y
UCLIBC_HAS_LIBICONV=y
UCLIBC_HAS_LIBINTL=y
UCLIBC_HAS_LOCALE=y
# UCLIBC_BUILD_MINIMAL_LOCALE is not set
UCLIBC_BUILD_ALL_LOCALE=y
# UCLIBC_HAS_XLOCALE is not set
UCLIBC_HAS_HEXADECIMAL_FLOATS=y
# UCLIBC_HAS_GLIBC_DIGIT_GROUPING is not set
UCLIBC_HAS_GLIBC_CUSTOM_PRINTF=y
UCLIBC_PRINTF_SCANF_POSITIONAL_ARGS=9
# UCLIBC_HAS_STDIO_BUFSIZ_256 is not set
# UCLIBC_HAS_STDIO_BUFSIZ_512 is not set
# UCLIBC_HAS_STDIO_BUFSIZ_1024 is not set
# UCLIBC_HAS_STDIO_BUFSIZ_2048 is not set
UCLIBC_HAS_STDIO_BUFSIZ_4096=y
# UCLIBC_HAS_STDIO_BUFSIZ_8192 is not set
UCLIBC_HAS_STDIO_BUILTIN_BUFFER_NONE=y
# UCLIBC_HAS_STDIO_BUILTIN_BUFFER_4 is not set
# UCLIBC_HAS_STDIO_BUILTIN_BUFFER_8 is not set
# UCLIBC_HAS_STDIO_SHUTDOWN_ON_ABORT is not set
UCLIBC_HAS_STDIO_GETC_MACRO=y
UCLIBC_HAS_STDIO_PUTC_MACRO=y
UCLIBC_HAS_STDIO_AUTO_RW_TRANSITION=y
UCLIBC_HAS_FOPEN_LARGEFILE_MODE=y
UCLIBC_HAS_FOPEN_EXCLUSIVE_MODE=y
UCLIBC_HAS_FOPEN_CLOSEEXEC_MODE=y
UCLIBC_HAS_GLIBC_CUSTOM_STREAMS=y
UCLIBC_HAS_PRINTF_M_SPEC=y
UCLIBC_HAS_ERRNO_MESSAGES=y
UCLIBC_HAS_SYS_ERRLIST=y
UCLIBC_HAS_SIGNUM_MESSAGES=y
UCLIBC_HAS_SYS_SIGLIST=y
UCLIBC_HAS_GNU_GETOPT=y
UCLIBC_HAS_GETOPT_LONG=y
UCLIBC_HAS_GNU_GETSUBOPT=y
# UCLIBC_HAS_ARGP is not set

#
# Big and Tall
#
UCLIBC_HAS_REGEX=y
UCLIBC_HAS_FNMATCH=y
UCLIBC_HAS_WORDEXP=y
UCLIBC_HAS_NFTW=y
UCLIBC_HAS_FTW=y
UCLIBC_HAS_FTS=y
UCLIBC_HAS_GLOB=y
UCLIBC_HAS_GNU_GLOB=y

#
# Library Installation Options
#
RUNTIME_PREFIX="/usr/i386-linux-uclibc"
DEVEL_PREFIX="/usr/i386-linux-uclibc/usr"
MULTILIB_DIR="lib"
HARDWIRED_ABSPATH=y

#
# Security options
#
# UCLIBC_BUILD_PIE is not set
UCLIBC_HAS_SSP=y
# SSP_QUICK_CANARY is not set
UCLIBC_BUILD_SSP=y
UCLIBC_BUILD_RELRO=y
UCLIBC_BUILD_NOW=y
UCLIBC_BUILD_NOEXECSTACK=y

#
# Development/debugging options
#
CROSS_COMPILER_PREFIX=""
UCLIBC_EXTRA_CFLAGS=""
# DODEBUG is not set
DOSTRIP=y
# DOASSERTS is not set
# SUPPORT_LD_DEBUG is not set
# SUPPORT_LD_DEBUG_EARLY is not set
# UCLIBC_MALLOC_DEBUGGING is not set
UCLIBC_HAS_BACKTRACE=y
WARNINGS="-Wall"
# EXTRA_WARNINGS is not set

Also, I am running EasyOS Pyro32 0.9.6:

http://bkhome.org/news/201808/easyos-32-bit-version-096.html

...when running, click "sfsget" icon at top of screen to download a "devx" SFS file, which is a compile compiling environment -- the GUI explains everything. The is also a x86_64 release.

bkauler commented 6 years ago

A couple more details:

With uclibc-ng, when I ran "make install", it installed to /usr/usr/i386-linux-uclibc In EasyOS, PREFIX is preset to "/usr", so I had to install like this:

# make install PREFIX=/

...so it installed to /usr/i386-linux-uclibc.

Another detail: with pts-tcc, I do not have 'upx', so changed these lines in 'pts-tcc-0.9.26-compile.sh':

#BK type -p upx.pts || type -p upx
...
#BK upx.pts --best pts-tcc || upx --best pts-tcc
#BK ./elfosfix.pl pts-tcc pts-tcc.uncompressed
./elfosfix.pl pts-tcc.uncompressed
pts commented 6 years ago

Thank you for reporting this!

Could you please clarify:

  1. Does it compile with uclibc 0.9.30.1? If not, what's the error message?
  2. Does it compile with uclibc-ng 1.0.30? If not, what's the error message?

Please note that the last time I run pts-tcc-0.9.26-compile.sh was 6 years ago with gcc-4.4 (if I can remember correctly). Sorry for not making the compilation script more reproducible.

One possible reason for the __rawmemchr failure can be that the #include path (gcc -I) set up by i386-uclibc-gcc.c is incorrect, and at some point gcc is loading the glibc .h files rather than the uclibc .h files, maybe because the gcc -I flag value generated by i386-uclibc-gcc.c doesn't point to the uclibc headers on your system: changing a string which looks like /usr/include in i386-uclibc-gcc.c can solve it.

Alternatively, you may want to use pts-xstatic (with gcc) instead of i386-uclibc-gcc.c to compile pts-tcc. pts-xstatic contains a copy of uClibc 0.9.30.1 and it is extra careful in hiding the glibc .h files.

Please note that my the available time for free support of pts-tcc is very limited, but I wish you luck in making it work, and I'd be interested in the results, so please comment on this issue if you have anything to share.

pts commented 6 years ago

Thank you for reporting this!

FYI I've rewritten https://github.com/pts/pts-tcc/blob/master/pts-tcc-0.9.26-compile.sh to make the compilation more reproducible (now it downloads and uses a specific precompiled uClibc 0.9.30.1 from pts-xstatic. I've also verified that it compiles with gcc-4.8, gcc-6.3 and gcc-7.3 without warnings or errors. I've also added some binary releases, e.g. https://github.com/pts/pts-tcc/releases/tag/v0.9.26-1 .

I'm closing this issue now because the underlying issue (it's hard to recompile pts-tcc-0.9.26) is resolved. Feel free to open a new issue if you encounter compilation problems.