공유 라이브러리 작성시의 -soname옵션에 대해서...

jx2h의 이미지

$(CC) -shared -Wl,-soname,$(LIB)$(MAJOR_V) -o $(LIB)$(MAJOR_V)$(MINOR_V) $(OBJS) -lc

일단 리눅스 플렛폼에선 버젼별로 라이브러리를 생성하는대 성공하였습니다만 솔라리스 머신에선 error...

ld: 경고: 옵션 -o(이)가 한번 이상 사용되었습니다. 처음 설정을 사용합니다.
ld: 치명적: 파일 libtest.so.1: 파일: 해당 파일이나 디렉토리가 없음(을)를 열 ?
ld: 치명적: 파일 처리 오류. libtest.so.1.0에 기록된 출력 없음

이러네요...
일단 -soname 옵션을 제거하면 컴파일은 잘 됩니다
개발환경으로는 linux머신(x86)의 gcc버젼은 3.3.2이고 solaris(sparc)머신은 3.4.1버젼 사용중입니다

익명 사용자의 이미지

일단 두 시스템에서

ld --version 으로 ld버전을 검토해보십시요.

jx2h의 이미지

해결되었습니다

솔라리스는(ld -V)
ld: Software Generation Utilities - Solaris/ELF (3.0)
이고 리눅스는(ld -v)
GNU ld version 2.14.90.0.6 20030820
입니다

그런데 의아한건 솔라리스가 버젼이 더 높은데도 --help하면 -soname옵션이 없다는 거죠...그래서 -soname대신 -f 옵션을 주니 리눅스, 솔라리스에서 다 먹네요
힌트 감사합니다^^

dead or alive(0 or 1)

pynoos의 이미지

이런 것들 때문에, automake, libtool 이 있는 것이지요.

익명 사용자의 이미지

autotools 버그 때문에 이제는 autotools 의 효용성이 와닿지 않네요.

김정균의 이미지

어느 부분의 버그인지는 모르겠지만, 잘 사용하는 사람도 많이 있습니다. 일부가 전체를 매도할 수 있을 것 같아서 잘 쓰고 있는 입장에서도 남겨 봅니다. :)

제 입장에서는 여전히 여러 arch 를 위한 빌드에서 autotools 덕분에 관리를 수월히 하고 있는 것 같습니다.

익명 사용자의 이미지

-Wl,--as-needed 이게 안 넘어가는 버그가 있습니다. 게다가 너무 느리고요..
GNU 가 아닌 시스템에서는 호환성이 좋지 않아서 결국 수작업으로 Makefile 만드는게 제일 좋더군요.
요새는 IDE 에서 빌드를 지원해주기도 하고, mason, ninja 이런게 유행이라 autotools 의 효용성이 전과는 다르게 많이 떨어집니다. 새로 시작하는 분들은 autotools 보다는 Makefile, mason 추천 드립니다.
autotools 그동안 고맙게 잘 썼습니다. 감사합니다.

김정균의 이미지

말씀 하신 바는 동의 합니다. autotools 보다 더 좋은 build tool 이 있다는 것은 당연히 동의가 되는 입장입니다.만 autotools 에 고쳐지지 않은 버그가 있다는 것 같은 늬앙스는 좀 동의가 되지 않아서 입니다.

-Wl,--as-need (--as-needed 라고 적어 주셨는데, 찾아봐도 --as-needed 는 없는 것 같아서..) 는 저도 잘 쓰고 있는 옵션입니다. 어떻게 사용하셨는지는 모르겠지만, LDFLAGS 로 넘기든, 아니면 automake 에서 xxxx_LDFLAGS = -Wl,--as-need -lLIBRARY 이렇게 넘기든 제가 사용하고 있는 autotools 에서는 잘 처리되고 있습니다. 특정 버전의 문제일 수는 있겠지만 그리고 글을 올려주신 분의 입장은 잘 이해가 됩니다만 (해당 문제가 있는 버전 때문에 고생하셔서 autotools 에 대한 미련이 없어졌겠지만..) 특정 문제를 일반화를 시키는 것은 좀 아닌 것 같아 이렇게 붙잡고 늘어져 봅니다.

안그래도, mason 이나 ninja 같은 것을 떠나서도, 일반적인 c library 배포나 c application 들도 대부분 cmake 로 넘어가는 추세라서 autotools 가 점점 자리를 잃어가고 있는 상황인 것은 부인할 수 없습니다만, 그래도 autotools 가 특정 버그가 있어서 사용하지 못할 정도이다 는 아닌 것 같습니다.

일단, 제가 테스트한 환경 입니다.

[root@host aaa]$ rpm -q autoconf automake libtool
autoconf-2.69-11.el7.noarch
automake-1.16.1-2.fc29.noarch
libtool-2.4.2-22.el7_3.x86_64
 
[root@host aaa]$ cat configure.ac
AC_PREREQ(2.59)
AC_INIT([sample], [1.0], [])
 
AM_INIT_AUTOMAKE([-Wall -Werror -Wno-override foreign no-dependencies])
AM_MAINTAINER_MODE
 
AC_CONFIG_SRCDIR([sample.c])
AC_CONFIG_HEADER([config.h])
AC_PREFIX_DEFAULT([/usr/local])
 
# Checks for programs.
AC_PROG_CC
AC_PROG_INSTALL
AC_PROG_LN_S
AC_PROG_AWK
AC_PROG_MAKE_SET
 
AC_HEADER_STDC
AC_C_CONST
AC_TYPE_SIZE_T
 
AC_CONFIG_FILES([Makefile])
AC_OUTPUT
 
[root@host aaa]$ cat Makefile.am
DISTCLEANFILES =
AM_CFLAGS = -Wall
 
bin_PROGRAMS = sample
sample_SOURCES = sample.c
sample_LDFLAGS = -Wl,--as-need -lkrisp
 
[root@host aaa]$ ./configure >& /dev/null
[root@host aaa]$ make
make  all-am
make[1]: Entering directory `/dev/shm/aaa'
gcc -DHAVE_CONFIG_H -I.    -Wall -g -O2 -c -o sample.o sample.c
gcc -Wall -g -O2 -Wl,--as-need -lkrisp  -o sample sample.o
make[1]: Leaving directory `/dev/shm/aaa'
 
[root@host aaa]$ readelf -d sample | grep NEED
 0x0000000000000001 (NEEDED)             Shared library: [libc.so.6]
 0x000000006ffffffe (VERNEED)            0x400340
 0x000000006fffffff (VERNEEDNUM)         1

P.S.
libtool 을 사용하도록 하게는 테스트 해 보지 않았는데, 여기서 발생할 수 있을지는 모르겠군요.

익명 사용자의 이미지

요 버그입니다. 참고하시기 바랍니다.

https://sigquit.wordpress.com/2011/02/16/why-asneeded-doesnt-work-as-expected-for-your-libraries-on-your-autotools-project/

-Wl,--as-needed 가 넘어가긴 넘어가는데,
-Wl,--as-needed 는 링커에 넘기는 위치가 중요한데, 위치가 바뀌어서 실제 적용이 안되는 문제가 있습니다.
-Wl,--as-needed -l... -l... -l... 이렇게 위치해야 하는데,
-l... -l... -l... -Wl,--as-needed 이런 식으로 위치가 바뀝니다. ㅠㅠ
ldd -u -r binary 로 확인합니다.
Makefile.am 이 수십개 있다보니 새로 짜는데 3일이나 걸리네요.
Makefile 써보니까... include 문을 사용할 수 있어서 Makefile 로도 자동화가 잘 되는 장점이 있네요.
configure 스크립트를 직접 작성했더니... 0.01초만에 결과 나오는데,
autotools 로는 10초 걸립니다. ㅠㅠ

김정균의 이미지

LDFALGS 가 libtool 에 의해서 gcc -shared 를 호출할 때의 위치 문제이군요. 어찌되었든 automake 의 xxxxxx_LDFLAGS 로 회피는 가능하겠지만, 수많은 Makefile 을 편집하느라 고생하시는 모습은 눈에 선합니다. :)

그리고, autotools 의 느린 속도는 저도 동감 입니다.

jx2h의 이미지

pynoos wrote:
이런 것들 때문에, automake, libtool 이 있는 것이지요.

그런데 automake를 사용하려면 어차피 그 플랫폼이 사용하고있는
ld, make 버젼에 맞추어서 Makefile.in을 작성해야 하지 않나요?

그렇다면 플랫폼별 Makefile을 작성해서 사용하는것과
별 다를바가 없는것 같은데...

dead or alive(0 or 1)

pynoos의 이미지

library 관련된 모든 옵션들은 libtool 이 알아서 해석해줍니다.
Makefile.in은 Makefile.am 에서 autoconf로 만들면 또한 간단하지요.

libtool 은 .la, .lo 등의 텍스트 파일로 시스템 의존적인 부분을 감싸기 때문에 처음에는 괴상하게 보여도 나중에는 기분에 편승해서 살게됩니다.

다만, 개념이해가 처음에 복잡하여서, 많은 라이브러리도 OS 마다 만들기도 합니다만, libtool 을 알고 나면, 상당히 세련된 파일을 만들어 낼 수 있습니다.

jx2h의 이미지

방금전부터 autotool가지고 깨작거리고 있습니다

보아하니 또 한 일주일 삽질 좀 해야할듯 싶네요 :lol:

그럼 수고하십시오

dead or alive(0 or 1)

pynoos의 이미지

http://bbs.kldp.org/viewtopic.php?t=24733

제 졸문이 조금이나마 도움되시길..

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.