Tôi đang phát triển mô-đun nút gốc cho AWS lambda. Mô-đun nút này cần json-cliên kết tĩnh không hoạt động đối với mô-đun nút
Theo mô-đun AWS lambda guidelines mô-đun nút không được có phụ thuộc động. Vì vậy, hãy thử liên kết phiên bản tĩnh của thư viện json-c. Nhưng tôi nhận được lỗi thời gian biên dịch.
Là một mô-đun nút chỉ là một thư viện chia sẻ, tôi đã viết một sample C application (với chính đổi tên) để mô phỏng biên soạn mô-đun nút và đây là kết quả:
g++ -shared -pthread -rdynamic -m64 -Wl,-soname=addon.node -o addon.node testjson.cpp -I /usr/include/json-c/ -L /lib/x86_64-linux-gnu/ -l:libjson-c.a
testjson.cpp: In function ‘int test()’:
testjson.cpp:6:14: warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]
char *str = "{ \"msg-type\": [ \"0xdeadbeef\", \"irc log\" ], \
^
/usr/bin/ld: /tmp/ccihB9d8.o: relocation R_X86_64_32S against `.rodata' can not be used when making a shared object; recompile with -fPIC
/tmp/ccihB9d8.o: error adding symbols: Bad value
collect2: error: ld returned 1 exit status
Và khi tôi thử với "- toàn bộ lưu trữ ":
g++ -shared -o libshared.so -Wl,--whole-archive -fPIC -l:/usr/lib/x86_64-linux-gnu/libjson-c.a -Wl,--no-whole-archive testjson.cpp -I /usr/include/json-c/
testjson.cpp: In function ‘int test()’:
testjson.cpp:6:14: warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]
char *str = "{ \"msg-type\": [ \"0xdeadbeef\", \"irc log\" ], \
^
/usr/bin/ld: /usr/lib/x86_64-linux-gnu/libjson-c.a(json_c_version.o): relocation R_X86_64_32 against `.rodata.str1.1' can not be used when making a shared object; recompile with -fPIC
/usr/lib/x86_64-linux-gnu/libjson-c.a(json_c_version.o): error adding symbols: Bad value
collect2: error: ld returned 1 exit status
Tôi đang làm gì sai? Không thể liên kết tĩnh một thư viện với một đối tượng được chia sẻ?
Bạn đã thử xây dựng mô-đun của mình trên vanilla Amazon Linux AMI? Điều này có thể cung cấp cho bạn gợi ý về những gì Lambda đang chạy. – kixorz